c涉及管道的并行过程

时间:2014-01-12 23:11:49

标签: 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万次,可以有人告诉我这是什么问题?所以有人慷慨地指出,读取序列化的东西,我该怎么做才能使这些过程真正并行?

1 个答案:

答案 0 :(得分:0)

父管道read序列化了一些东西。

你(1)创造孩子; (2)孩子写管道; (3)父母将在read上阻止,直到有东西要读。这对所有孩子都重复。