通过来自多个子节点的管道写入父进程

时间:2015-09-04 22:21:18

标签: c multithreading pipe inter-process-communicat

这是我的情况代码。基本上,我有很多孩子,他们应该从ptList计算一定数量的点,将相应的点传递给父,并且父母将它们加起来。不幸的是,使用我的printfs,“addToTotal”变量没有更新超过第一个孩子,我的答案是不正确的。任何建议都会令人难以置信。

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;
}

2 个答案:

答案 0 :(得分:1)

孩子得到一个关闭写边的管道,因为你在行中明确地将它关闭了:

rm -rf .git

然后在下一次迭代中尝试再次写入管道:

close( pfd[ 1 ] );

答案 1 :(得分:0)

在循环的第一次迭代中,父级关闭管道的写入侧。在第二次迭代中,子进程继承写入端关闭的管道。你不能关闭循环中的写入端,所以你需要有第二个循环来进行读取。