2011-03-30 51 views
0

所以我在寫一個程序,如下將在輸入文件:C/Unix的規劃問題管道

1 1 1 1 
1 1 1 1 
1 1 1 1 
4 4 4 4 

它會fork()一個新的子進程的每一行,每一子進程將計算它們各自的行的總和(它已經被硬編碼,儘管將其改變爲一般情況是微不足道的)。

的代碼如下:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <string.h> 
#include <sys/wait.h> 
#include <ctype.h> 

#define cols 100 //not used 
#define rows 4 //easily modifiable 

int main() 
{ 
int count=0; //count for children 
int fd[2]; 
FILE *fp = fopen("input.dat", "r"); 
setbuf(fp,NULL); //unbuffered 

double sum = 0; //parent sum (and average) 
int childStatus; //used in the wait command 

char c; //char for reading in numbers 
int pid; //store process id 
int childsum=0; 

for(count=0;count<rows;count++) 
{ 
    pipe(fd); 
    pid=fork(); //duplicate process 

    if(pid==0) //if child is done 
    { 
     close(fd[0]); //close the reader 
     childsum=0; //child's sum 
     while(c!='\n') 
     { 
      fread(&c, sizeof(c), 1, fp); //read in integer 
      if(c != ' ') 
      { 
       childsum=childsum+atoi(&c); //to calculate the sum 
      } 
     } 
     write(fd[1], &childsum, sizeof(int));//write to pipe 
     printf("Child %d: %d\n", count+1, childsum); //output child's sum to the screen 
     close(fd[1]); //close remaining file 
     exit(0); //exit current child 

    } 
    else 
    { 
     close(fd[1]); //close the writer 
     //read from pipe 
     char* buf; 
     while(read(fd[0], buf, sizeof(buf))!=sizeof(buf)) 
     { 
      sum = sum + atoi(buf); 
     } 
     close(fd[0]); //close remaining file 
    } 

} 
sum = sum/count; 
printf("Parent Average: %f", sum); 
fclose(fp); 
return 0; //end 
} 

代碼運行良好一次,並且唯一的錯誤是,沒有被計算的父平均(sum)。但是,當我再次運行它時,在打印第一個孩子的總和(在本例中爲4)後停止。如果它已經運行一次,爲什麼會發生這種情況呢?是什麼導致它停止?

回答

3

有你的代碼中的多個問題:

  • 父進程讀入buf,而您還沒有分配的內存(這就是爲什麼整個事情崩潰最可能的原因);
  • 您正在編寫childsum作爲二進制數據,但試圖將其讀取爲包含數字的ASCII字符串。
+0

我很困惑我如何才能正確讀取數據。我試圖用read()函數輸出。 – muttley91 2011-03-30 18:43:04

+0

如何將'read()'轉換爲'int'(以反映write()')? – NPE 2011-03-31 07:14:27