繁体   English   中英

这个C程序如何工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM