Sana Ullah
Sana Ullah

Reputation: 1

I want to create two communication between parent and child residing in different C files using ordinary pipes (IPC)

I am trying to send message from parant.c to child.c and I am successfully receiving it in the child.c My question is that how can I send message back to the parent using second pipe from child.c I want the exact sequence of code.

Here is my parent.c:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>

int main(int argc, char *argv[])
{
    int fd[2];
    char buf[] = "HELLO WORLD!", receive[100];
    if (pipe(fd))
    {
        perror("pipe");
        return -1;
    }
    switch (fork())
    {
    case -1:
        perror("fork");
        return -1;
    case 0:
        // child
        close(fd[1]);              // close write end
        dup2(fd[0], STDIN_FILENO); // redirect stdin to read end
        close(fd[0]);             // close read end
        execl("./child", NULL); // execute child

    default:
        // parent
        close(fd[0]);                   // close read end
        write(fd[1], buf, sizeof(buf)); // write to write end
        close(fd[1]);                   // close write end
        wait(NULL);
    }

    printf("\nEND~\n");
    return 0;
}

I am sending buf ("Hello world") to the child by executing ./child file. Here is my child.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    int fd[2];
    pid_t pid = fork();
    char buf[100], child_msg[] = "From Child: Hello Parent";
    if (pipe(fd))
    {
        perror("pipe");
        return -1;
    }
    switch (pid)
    {
    case -1:
        perror("fork");
        return -1;
    case 0:

        read(STDIN_FILENO, buf, sizeof(buf));
        printf("%s ", buf);
        close(fd[1]);
    default:
        wait(NULL);
        
        
    }
    return 0;
}

I am receiving Hello world in this file. but now how can I send child_msg back to the parent? I don't how to do that. I am stuck at this for last 14 hours.

Upvotes: 0

Views: 63

Answers (1)

Ani
Ani

Reputation: 1536

From main pipe:

pipe() creates a pipe, a unidirectional data channel ...

So, you need 2 pipes, i.e., you have to create 2 pipes in your main process that will also be inherited by the child process.

From your code, you are execing another program, in such cases you might be better off with other IPCs and not pipe!

Upvotes: 1

Related Questions