【问题标题】:Using pipes to pass data between child processes in C使用管道在 C 中的子进程之间传递数据
【发布时间】:2016-11-30 15:58:41
【问题描述】:

我的作业任务是编写一个 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);
}

对于这种情况,我必须做些什么,才能获得一个(和正确的)输出?

【问题讨论】:

  • 我认为你需要 buf[5],假设你的机器中的 int 是 4 字节长。

标签: c process pipe fork


【解决方案1】:

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

此外,我怀疑您的管道是否可以那样工作。 分叉任何孩子之前,您关闭其中两个的写端(其中一个两次)。那些不会神奇地为孩子们重新打开,所以他们的整个管道都是无用的。

【讨论】:

  • 对不起,我编辑了代码...我 ment close(pipe3[1]).. 所以我不应该在 switch case 之前关闭管道,并且在我需要 _exit(0) 的每个 if 语句中结束了吗?
  • @Luki,在派生所有需要使用该管道末端的子代之前,父代不应关闭其任何管道末端的副本。在循环之后避免所有闭包将是实现此目的的简单方法。您确实需要确保每个孩子在完成其预期工作后退出;在每个人的if 块中放置一个_exit(0) 是实现这一目标的一种方法。
  • 我已经解决了 :) 谢谢你非常清楚的回答。
  • 我不明白你的代码是如何工作的,即使你收到了所有 cmets ans 的答案,你从来没有在 pipe3 中写过(缺少 if case j == 2)
猜你喜欢
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2012-10-03
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多