【发布时间】: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 字节长。