2016-10-18 41 views
1

我正試圖將信息從子進程傳遞給此程序中的父進程。下面的代碼,到目前爲止,在清除它仍在工作:嘗試彙總文件並通過管道/叉/進程傳輸時出錯?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

main() { 

    char *s, buf[1024]; 
    int fds[2]; 
    int sum; 
    s = "Hello world!\n"; 
    FILE *file; 
    pipe(fds); 

    if(fork()==0){ 
     printf("child process: \n"); 
     int c; 
     int number; 
     sum = 0; 

     file = fopen("file1.dat", "r"); 
     if (file) { 
      while ((c = getc(file)) != EOF){ 
       sum+=c;  
       printf("child process: step 1"); 
       fclose(file); 
      } 
     } 

     write(fds[1],&sum,12); 
     exit(0); 
    } 
    read(fds[0],buf,12); 
    write(1,buf,strlen(s)); 

} 

它是正確無誤的編譯,但返回的後面是一堆無法識別的字符(問號)當我運行它的數字6。

我可能會錯過什麼?我的感官告訴我一些與閱讀的東西。

編輯:我要補充一點,我的目的是讓子進程來打開和讀取文件(其中包含數字的多線),並把它們加起來,總回父進程。

回答

3

假設sizeof(int) == 4,你寫12個任意字節(4其中代表的sumint值 - 另外8個字節未定義給予行爲,因爲他們不是「在同一陣列」作爲sum的一部分)到管,並然後你將它們讀入buf。然後您嘗試使用write()將任意字節打印到標準輸出。

你不檢查任何錯誤;你應該。

你確實需要的字節轉換回一個ASCII數字流,使價值感。您應該使用write(fds[1], &sum, sizeof(sum))寫,read(fds[0], &sum, sizeof(sum))閱讀,然後你可以用printf("%d\n", sum);打印。或者您可以自己進行轉換,並仍然使用write()來打印轉換後的字符串。或者,您可以將sum轉換爲子字符串中的一串數字。或...

+0

謝謝你的迴應。我會看看,看看這是我的問題。 –