2017-08-12 218 views
1

我的任务是传递在命令行中输入的整数,并将它们通过从父母到孩子的管道传递,整数可以加在一起并通过收获返回给父母。我所有的整数变成在孩子4号,以及总和收获价值总是返回为数字1从父母到孩子传递整数的错误输出

#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

static int toChild[2]; 
static int toParent[2]; 
static int input; 
static int output; 

int main(int argc, char **argv) 
{ 
    pid_t pid; 
    int  status; 
    int  nInts = argc; 
     // set up pipe 
    pipe(toChild); 
    pipe(toParent); 
     // call fork() 
    pid = fork(); 

    if (pid == 0) { 
     close(toChild[1]); 
     close(toParent[0]); 
      // -- running in child process -- 
     int  sum = 0; 
      // Receive characters from parent process via pipe 
      // one at a time, and count them. 
      // Return sum of numbers. 
     for (int i=1; i < nInts; i++) { 
      output = read(toChild[0], &input, sizeof(input)); 
      sum += output; 
      } 

     return sum; 
     close(toChild[0]); 
     close(toParent[1]); 
     } 
    else { 
     close(toChild[0]); 
     close(toParent[1]); 
      // -- running in parent process -- 
      // Send numbers (datatype: int, 4 bytes) from command line arguments 
      // starting with argv[1] one at a time through pipe to child process. 

     for (int i=1; i < nInts; i++) { 
      input = atoi(argv[i]); 
      write(toChild[1], &input, sizeof(input)); 
      } 

     waitpid(pid, &status, 0); 
     if(WIFEXITED(status)){ 
      // Wait for child process to return. Reap child process. 
      // Receive sum of numbers via the value returned when 
      // the child process is reaped. 
      printf("sum = %d\n", WIFEXITED(status)); 
     } 
     close(toParent[0]); 
     close(toChild[1]); 
     return 0; 
     } 
} 
+1

你为什么在返回后调用'close'? –

+0

我很担心它是否会在太早关闭通讯之前。 –

+0

我的意思是那些'close'永远不会被调用,不是吗? –

回答

1
output = read(toChild[0], &input, sizeof(input)); 
sum += output; 

您的read的返回值分配给output。这是读取的字节数,即sizeof(input),在您的平台上是4。所以,你总是由4

增加sum你想:

ssize_t bytes_read = read(toChild[0], &input, sizeof(input)); 
//check that bytes_read == sizeof(input) here 
sum += input; 

另外:

printf("sum = %d\n", WIFEXITED(status)); 

WIFEXITED只是说,这个过程是否退出。使用WEXITSTATUS获取退出状态。

相关问题