2017-08-12 11 views
1

私の割り当ては、コマンドラインで入力された整数を渡して、親から子にパイプを通し、整数を一緒に追加して刈り取って親に戻すことです。私の整数のすべての子に番号4に変わり、和のための刈り取り値は常にあなたがoutputreadの戻り値を代入されている番号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

なぜあなたは 'return'の後に' close'を呼びますか? –

+0

あまりに早くコミュニケーションが終わる前であれば心配でした。 –

+0

「クローズ」は決して呼び出されないということですね。 –

答えて

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

として返します。これは読み取られたバイト数です(つまり、sizeof(input))。プラットフォームによっては4です。だから、あなたは常にあなたがしたいsum 4によって

が増加している。また

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を使用してください。