使用管道在C中的子进程之间传递数据

时间:2016-11-30 15:58:41

标签: c process pipe fork

我的家庭作业任务是编写一个C程序,创建4个子进程,每个孩子必须用整数做一些事情并将其发送给下一个用它做其他事情的孩子,最后一个必须打印更改的值。我必须使用匿名管道在孩子之间进行通信。除了打开儿童管道之外,父进程没有其他工作。我已经编写了程序,但问题是当我尝试使用最后一个孩子打印数字时,我得到了有趣的输出。它打印出8个数字而不是1个(实际上其中一个是正确的)。代码的一部分如下:

int pipe1[2];
int pipe2[2];
int pipe3[2];
pipe(pipe1);
pipe(pipe2);
pipe(pipe3);

int j;

close(pipe1[1]);   //close pipes for writing on parent process
close(pipe2[1]);
close(pipe3[1]);

for (j = 0; j < 4; j++) {
   switch(fork()) {
   case 0:
       if (j == 0) {
          int value = 100;
          write(pipe1[1], &value, sizeof(int));
          close(pipe1[1]);
       }
       else if (j == 1) {
          int value;
          read(pipe1[0], &value, sizeof(int));
          close(pipe1[0]);
          value = value * 10;
          write(pipe2[1], &value, sizeof(int));
          close(pipe2[1]);
       }
    //and so on until the last process
       else if (j == 3) {
          int value;
          read(pipe3[0], &value, sizeof(int));
          char buf[4] = {0};
          memset(buf, 0, sizeof(buf));
          snprintf(buf, sizeof(value), "%d ", value);
          write(1, buf, strlen(buf));
       }
       break;
   }
}
close(pipe1[0]);
close(pipe2[0]);
close(pipe3[0]);
sleep(1);

int k;

for (k = 0; k < 4; k++) {
   wait(0);
}

对于这种情况,我需要做些什么,只是为了得到一个(和正确的)输出?

1 个答案:

答案 0 :(得分:1)

当您的一个子进程在您提供的代码中执行break语句时,您认为会发生什么?提示:它不会退出。

另外,我怀疑你的烟斗是否能像那样工作。在分支任何孩子之前,你关闭其中两个(其中一个)的写入结束。那些不会为孩子们重新打开,所以他们的整个管道都没用了。