这个C程序如何工作?

时间:2014-02-13 17:19:42

标签: c unix

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。

  • 的值

但是我仍然不确定这个程序是如何工作的,请随时纠正或提供更多细节。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

你很亲密。

您对子进程如何运作的描述是正确的。

父进程从管道中读取每个数字。它没有测试z是否为0,它正在测试read是否返回0,它在达到EOF时(即孩子关闭了管道)时会这样做。并且它没有显示&z的值,它将z的所有值相加,并在到达结尾时显示总数。

答案 1 :(得分:1)

如上所述,代码有点奇怪,因为读写函数的第二个和第三个参数似乎是倒退的。 “从sizeof(int)指向的缓冲区中写入&amp; y字节”这很奇怪,因为sizeof()任何东西都不是缓冲区。

如果你交换这两个,那么子进程从控制台读取整数并将奇数写入管道回到父级,父级读取它们,对它们求和并在EOF打印总和。