2014-02-13 34 views
-1
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] ==>然后,它创建一个新进程这个C程序是如何工作的?

  • 如果s = 0 ==>程序输入10个整数==>如果整数是奇数==>它会启动子函数==>它将sizeof(int)指向的缓冲区写入& x字节到与打开文件描述符,fd [1] ==>它释放由fd [1]指示的文件描述符

  • 它启动父函数如果s!= 0 ==>如果& V = 0 ==>它显示& v的值。

但我还是不知道如何计划的运作方式,请随时纠正或给予更多细节。感谢您的帮助!

+1

请注意,您应该检查* scanf *的返回值。现在,如果它读取非数字,它将返回0,并保留* y *不变(因此可能在此代码中未初始化),并将非数字保留为未读(所以它将保持返回0而不读取任何内容)。 – hyde

+5

你不能删除那样的内容。人们已经回答了。摧毁你的问题使他们的答案无效。如果你不想在线,你不应该问这个问题。通过在这里发布,你已经永久地将内容授权给网站。请保留原地。 – Stijn

+0

@ user3305709如果您希望看到此内容被删除的原因很充分,请使用“其他”选项标记主持人注意力。然后清楚地解释为什么这需要被删除。虽然也许你只需要解除关联。如果因为这种情况而被暂停,那么像这样删除它最终只会伤害你。 – Bart

回答

2

你很近。

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

父进程从管道读取每个编号。它不在测试z是否为0,它正在测试read是否返回0,当它到达EOF时(即,孩子已关闭管道),它会执行此操作。它不显示&z的值,它将z的所有值相加,并在到达结尾时显示总值。

1

正如所写,代码有点奇怪,因为读写函数的第二个和第三个参数看起来倒退了。 “从sizeof(int)指向的缓冲区中写入& y字节是奇怪的,因为sizeof()不是缓冲区。

如果交换这两个,那么子进程会从控制台读取整数,然后将奇数部分写回管道,返回给父母,读取它们并将它们相加并在EOF处打印总和。