TheBuffED
TheBuffED

Reputation: 65

Writing to parent process through pipe from multiple children

Here's my code for the situation. Basically, I've got a number of children and they're supposed to count up a certain number of points from ptList, pass the respective points to the parent, and the parent adds them up. Unfortunately, with my printfs, the "addToTotal" variable isn't updating past the first child and my answer is incorrect. Any advice would be incredible.

pid_t worker[ workers ];
for (int i = 0; i < workers; i++) {
//printf( "I am child %i\n", i );
if ((worker[i] = fork()) < 0) {
   fail( "Can't create child");
} else if ( worker[i] == 0) {
   //Close the reading end of the pipe for each child
   close( pfd[0] );

   // Get each of the workers to compare points
   for ( int k = i; k < ptCount; k += workers ) {
      for ( int j = k + 1; j < ptCount; j++) {
        int dx = ptList[ k ].x - ptList[ j ].x;
        int dy = ptList[ k ].y - ptList[ j ].y;
        if ( dx * dx + dy * dy <= dsq )
           childTotal++;
      }
   }
   printf( "Child %i total: %i\n", i, childTotal );
   lockf( pfd[ 1 ], F_LOCK, 0 );
   write( pfd[ 1 ], &childTotal, sizeof( childTotal ));
   lockf( pfd[ 1 ], F_ULOCK, 0 );
   close( pfd[ 1 ] );
   exit(0);
   wait(NULL);
}
wait(NULL);
close( pfd[ 1 ] );
read( pfd[ 0 ], &addToTotal, sizeof( addToTotal ) );
printf( "AddToTotal: %i\n", addToTotal );
total += addToTotal;
}

Upvotes: 1

Views: 905

Answers (2)

4pie0
4pie0

Reputation: 29744

The child gets a pipe on which the write side is closed, because you close it expliciltly in the line:

close( pfd[ 1 ] );

and then in the next iteration you try to write to pipe again:

write( pfd[ 1 ], &childTotal, sizeof( childTotal ));

Upvotes: 1

William Pursell
William Pursell

Reputation: 212434

On the first iteration of the loop, the parent closes the write side of the pipe. On the second iteration, the child inherits a pipe on which the write side is closed. You can't close the write side inside the loop, so you'll need to have a second loop to do the reads.

Upvotes: 0

Related Questions