涉及管道的c并行进程

标签 c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
   int i;

   int fd[2];
   int values[argc - 1];


   for( i = 1; i < argc; i++ ) {
      pipe(fd);

      switch( fork()) { 
      case 0: /* child */
         /* Do stuff */
         close(fd[0]);
         int value = atoi(argv[i]);
         write(fd[1], &value, sizeof(value));
         exit( 0 );
      case -1:
         perror( "fork" );
         exit(1);
      default:  /* parent */
         close(fd[1]);
         read(fd[0], &values[i - 1], sizeof(values[i - 1]));
         /* do stuff, but don't wait() or terminate */
      } 
   }

   for (i = 0; i < (argc - 1); i++)
   {
      printf("%d\n", values[i]);
   }

   return 0;
}

我尝试创建与赋予可执行文件的参数数量一样多的进程,并让每个进程将参数通过管道传递给父进程并存储到数组中,最后打印出数组的元素。由于进程是并行运行的,当我打印出数组元素时,相对于我输入这些元素的顺序,顺序应该是随机的,但情况似乎并非如此,因为我已经运行了可执行文件 100 万次,有人可以吗告诉我问题是什么?所以有人善意地指出,读取序列化了事物,我应该怎样做才能使进程真正并行?

最佳答案

父级中的管道read会序列化事物。

您 (1) 创建子项; (2)子进程向管道写入; (3) 父级将阻塞在read上,直到有东西要读。对所有 child 重复此操作。

关于涉及管道的c并行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21081526/

相关文章:

c - 从函数返回一对项目

将文件与路径连接起来以在 C 中获取完整路径

c - 什么时候下溢?

c - 如何在 C 中将变量分配给 rand() ?

c - 通过 c 中的函数添加和释放二维数组

c - 如何在 C 中存储字符串数组并将其打印回来?

c - 对字符进行编码最有效的方法是什么? (关于内存)

python - 如何为 C 分配的 numpy 数组注册析构函数?

c - 在c中使用堆栈进行前序遍历

c - 如何读取/写入存储在通过 bin2C 实用程序创建的文本文件中的 C 数组