我正在学习 Linux 中的流程管理,我需要让孩子和父母通过管道进行交流。我已经声明了两个结构:
typedef struct
{
double min, max, avg; /*Number stats*/
} Stats;
typedef struct {
pid_t pid; /*Process ID*/
int first; /*First number to process*/
int last; /*Last number to process*/
int fd[2]; /*Pipe descriptor*/
Stats stats; /*Stats computed by process*/
}Process_list;
我需要 M 个子进程从一组数字中计算一些统计数据(划分工作)。然后,子进程将读取 Process_list 结构,从头到尾处理数组中的数字(在此处指定)并将计算的统计信息保存到 stats 结构中。
与我的代码问题最相关的部分如下(我正在添加注释而不是其他代码来解释可以完成的操作):
int main(int argc, char *argv[])
{
pList=(Process_list *)malloc((M+1)*sizeof(Process_list));
/*Correct allocation is checked*/
int i;
pid_t pid;
for (i=0 ; i<M ; i++) /*M clones*/
{
/*Fork and pipe creation*/
pid = fork ();
pipe(pList[i].fd);
/*If it's the child*/
if ( pid == 0 )
{
pList[i].pid=pid;
printf("CHILD %d: %d a %d\n",i, pList[i].first,pList[i].last);
/*A function here computes stats and saves them OK in the struct*/
/*(e.g. min is saved in pList[i].stats.max, when printed it's a reasonable value)*/
/*Now I need to send the info to the parent*/
ret1=close(pList[i].fd[0]);
/*ret1=0 => OK */
ret2=write(pList[i].fd[1], &(pList[i].stats), sizeof(Stats));
printf("return write: %d\n",ret2);
/*TROUBLE HERE! This isn't even printed. sizeof(Stats)=24 which I think is OK*/
exit(EXIT_SUCCESS);
}
/*Parent*/
else if ( pid > 0 )
{
wait(NULL); /*Is this really neccesary?*/
ret1=close(pList[i].fd[1]);
ret2=read(pList[i].fd[0], &(pList[i].stats), sizeof(Stats));
/*Both ret1 and ret2 = 0*/
printf("[p]Mín: %lf\n Max: %lf\nAverage: %lf\n",pList[i].stats.min,pList[i].stats.max,pList[i].stats.avg);
/*Everything printed here = 0.0000000000*/
}
else /*fork error*/
return -1;
}
所以我的问题是孩子们完美地计算了他们的统计数据,但父母没有收到他们。write() 函数什么也不做。这发生在 M 的每一个值上(包括 M=1 - 只有一个进程)。
另外我不知道是否需要等待(NULL),因为我已经看到了一些不使用它的工作示例。但是,如果我不在那里写,则父母的 printfs 将出现在孩子的之前,所以我认为它只是不等待孩子在管道中写入。无论如何,它没有它是行不通的。
或者也许结构方法不是一个好方法?
非常感谢您!