2016-11-30 68 views
0

我的作业任务是编写一个C程序,该程序创建4个子进程,每个子进程必须使用整数进行处理并将其发送给另一个执行其他操作的子进程它和最后一个必须打印更改的值。我必须使用匿名管道来进行孩子之间的沟通。家长过程除了为孩子打开管道之外没有别的工作。我已经编写了这个程序,但问题是当我尝试使用最后一个孩子打印数字时,我得到了有趣的输出。它打印出8个数字而不是1个(实际上其中一个是正确的)。代码的一部分如下:使用管道在子进程之间传递数据C

int pipe1[2]; 
int pipe2[2]; 
int pipe3[2]; 
pipe(pipe1); 
pipe(pipe2); 
pipe(pipe3); 

int j; 

close(pipe1[1]); //close pipes for writing on parent process 
close(pipe2[1]); 
close(pipe3[1]); 

for (j = 0; j < 4; j++) { 
    switch(fork()) { 
    case 0: 
     if (j == 0) { 
      int value = 100; 
      write(pipe1[1], &value, sizeof(int)); 
      close(pipe1[1]); 
     } 
     else if (j == 1) { 
      int value; 
      read(pipe1[0], &value, sizeof(int)); 
      close(pipe1[0]); 
      value = value * 10; 
      write(pipe2[1], &value, sizeof(int)); 
      close(pipe2[1]); 
     } 
    //and so on until the last process 
     else if (j == 3) { 
      int value; 
      read(pipe3[0], &value, sizeof(int)); 
      char buf[4] = {0}; 
      memset(buf, 0, sizeof(buf)); 
      snprintf(buf, sizeof(value), "%d ", value); 
      write(1, buf, strlen(buf)); 
     } 
     break; 
    } 
} 
close(pipe1[0]); 
close(pipe2[0]); 
close(pipe3[0]); 
sleep(1); 

int k; 

for (k = 0; k < 4; k++) { 
    wait(0); 
} 

对于这种情况,我需要做些什么,只是为了得到一个(和适当的)输出?

+0

您需要buf [5]我认为,假设int在您的机器中长度为4个字节。 – MayurK

回答

1

当您的某个子进程在您提供的代码中执行break语句时,您会如何看待?提示:它不会退出。

此外,我怀疑你的管道可以像这样工作。您可以在之前关闭其中两个(其中两个的其中一个)的写入结尾。那些孩子不会神奇地重新开放,所以他们的整个管子都没用。

+0

对不起,我编辑的代码...我关闭(pipe3 [1])..所以我不应该关闭管道之前切换大小写和每一个if语句我需要在末尾_exit(0)? – Luki

+0

@Luki,在分叉所有需要使用管端的孩子之前,父母不应该关闭其任何管端的副本。避免所有闭包,直到循环完成后才是一种简单的方法。您确实需要确保每个孩子在完成其预定工作时退出;将'_exit(0)'放在每个'if'块中将是实现该目的的一种方式。 –

+0

我已经解决了:)谢谢你一个非常明确的答案。 – Luki