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.