void child(int *fd) {
int j , x;
for(j = 0; j < 10; j ++) {
scanf ("%d", &x);
if(x % 2 != 0)
write(fd[1], sizeof(int), &x);
}
close (fd[1]);
}
void parent(int *fd) {
int v, r = 0;
while(read(fd[0], sizeof(int), &v) != 0)
r = r + v;
printf("%d\n", r);
}
int main(void) {
int s, fd[2];
pipe(fd);
s = fork();
if(s == 0)
child(fd);
else parent(fd);
}
我认为上面的程序创建了一个管道fd并放置了两个文件描述符,每个文件描述符分别为参数fd [0]和fd [1] ==&gt;然后它创建一个新的过程
如果s = 0,则启动子函数==&gt;程序输入10整数==&gt;如果整数是奇数==&gt;它将sizeof(int)指向的缓冲区中的&amp; x字节写入与打开文件描述符相关联的文件,fd [1] ==&gt;它解除分配由fd [1]
如果s!= 0 ==&gt;它会启动父函数if&amp; v = 0 ==&gt;它显示&amp; v。
但是我仍然不确定这个程序是如何工作的,请随时纠正或提供更多细节。谢谢你的帮助!
答案 0 :(得分:2)
你很亲密。
您对子进程如何运作的描述是正确的。
父进程从管道中读取每个数字。它没有测试z
是否为0,它正在测试read
是否返回0,它在达到EOF时(即孩子关闭了管道)时会这样做。并且它没有显示&z
的值,它将z
的所有值相加,并在到达结尾时显示总数。
答案 1 :(得分:1)
如上所述,代码有点奇怪,因为读写函数的第二个和第三个参数似乎是倒退的。 “从sizeof(int)指向的缓冲区中写入&amp; y字节”这很奇怪,因为sizeof()任何东西都不是缓冲区。
如果你交换这两个,那么子进程从控制台读取整数并将奇数写入管道回到父级,父级读取它们,对它们求和并在EOF打印总和。