[英]How does this C program work?
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] ==>中,然后创建了一个新进程
如果s = 0 ==>程序输入10个整数==>如果整数是奇数==>,它将启动子函数。它将sizex(int)所指向的缓冲区中的&x字节写入与打开的文件关联的文件中描述符fd [1] ==>它将fd [1]指示的文件描述符释放
如果s!= 0 ==>如果&v = 0 ==>,它将启动父函数,并显示&v的值。
但是我仍然不确定该程序如何工作,请随时进行更正或提供更多详细信息。 感谢您的帮助!
你近了
您对子进程如何工作的描述是正确的。
父进程从管道读取每个数字。 它不是在测试z
是否为0,而是在测试read
是否返回0,这在达到EOF(即孩子已关闭管道)时会执行。 而且它不显示的值&z
,它加起来的所有值z
,当它到达终点显示总。
在编写时,该代码有点奇怪,因为读取和写入功能的第二个和第三个参数看起来是向后的。 “从sizeof(int)所指向的缓冲区写入&y字节”很奇怪,因为sizeof()都不是缓冲区。
如果交换这两个,则子进程将从控制台读取整数,并将奇数写入到返回父级的管道中,后者将读取它们,求和并在EOF上打印总和。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.