通过管道从多个子进程写入父进程

Posted

技术标签:

【中文标题】通过管道从多个子进程写入父进程【英文标题】:Writing to parent process through pipe from multiple children 【发布时间】:2015-09-04 22:21:17 【问题描述】:

这是我针对这种情况的代码。基本上,我有很多孩子,他们应该从 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;

【问题讨论】:

在循环的第一次迭代中,父级关闭管道的写入端。在第二次迭代中,子进程继承了一个写端关闭的管道。 【参考方案1】:

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

close( pfd[ 1 ] );

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

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

【讨论】:

【参考方案2】:

在循环的第一次迭代中,父级关闭管道的写入端。在第二次迭代中,子进程继承了一个写端关闭的管道。您无法关闭循环内的写入端,因此您需要有第二个循环来执行读取操作。

【讨论】:

以上是关于通过管道从多个子进程写入父进程的主要内容,如果未能解决你的问题,请参考以下文章

C管道写入/读取双打序列失败

golang父进程通过管道向子进程传递数据

swoole父进程和子进程之间通信的例子

swoole父进程和子进程之间通信的例子

当父进程为 64 位时,StdIN/StdOUT 管道出现问题

阻止写入标准输出