Multiple pipes and processes

c, child-process, fork, operating-system, pipe

Solution

You're probably thinking that some specific `pipe[2]` is shared by the parent and it's respective child process. That's true ... However it is also shared by all the other children processes you create along the way - and because it's opened, those other children processes also inherit it as opened.

Doing this at the beginning of your child pid check worked for me:

if (pid == 0) {
    int j;
    for (j = 0; j < num_children; j++) {
        if (j != i) {
            close(fd[j][0]);
            close(fd[j][1]);
        }
    }
    ...
}

Problem

I am trying to communicate with children processes and make them sort a part of a list. My problem is children processes read everything but do nothing after it. ``` int main(int argc, char *argv[]){ int i; int num_children; pid_t pid; num_children= 3; int fd[num_children][2]; //PIPES for (i=0; i<num_children; i++) { if (pipe(fd[i]) == -1) { printf("couldnt create the pipe\n"); exit(EXIT_FAILURE); } } for (i=0; i<num_children; i++) { pid = fork(); if (pid == -1) { printf("couldnt create child process %i\n",i); exit(EXIT_FAILURE); } if (pid == 0) { //this is child process close(fd[i][1]); //closing fd[1] the write end of the pipe int received; node *list = NULL; while ( read(fd[i][0], &received, sizeof(int)) > 0) { list = insert(list, received); printf("Process %i got the number: %i\n",i,received); //this part is working perfect } printf("Im process %i here is my list: \n",i); //i couldnt get any output from here printList(list); close(fd[i][0]); exit(EXIT_SUCCESS); } } for (i=0; i<num_children; i++) //closing the read end of pipe for parent { close(fd[i][0]); } int number; int mod; FILE *fileIn = fopen ("<file directory>","r"); while(fscanf(fileIn, "%i", &number)>=0) { mod = number % num_children; write(fd[mod][1], &number, sizeof(int)); } for (int i=0; i<num_children; i++) { if(close(fd[i][1])==0) { printf("cant close the pipe"); //tried to catch errors, but pipes are closing with no problem i think } } return 0; ``` I tried to see if children process wait in the while(read) loop, but when i close the write end of pipes from the parent process they should leave the loop.

Original source