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)後停止。如果它已經運行一次,爲什麼會發生這種情況呢?是什麼導致它停止?
我很困惑我如何才能正確讀取數據。我試圖用read()函數輸出。 – muttley91 2011-03-30 18:43:04
如何將'read()'轉換爲'int'(以反映write()')? – NPE 2011-03-31 07:14:27