我正忙于一项任务,但我被困住了。我得到错误,我不明白我做错了什么。
所以我主要生了三个孩子。在第一个和第二个之间我有一个管道(pipe12
)。在第二个和第三个之间我有一个管道(pipe23
)。现在,当第一个孩子 ( reader
) 准备好阅读时,它会关闭pipe12
,但第二个孩子的阅读没有得到EOF
. 其次,当第二个孩子想写信时pipe23
,孩子崩溃了。
我想我在管道的初始化中做错了什么,但是什么?
这是家长
for(childnr=2; childnr>=0;childnr--)
{
tasks[childnr].pid=fork();
if(tasks[childnr].pid==-1)
{
printf("fork error\n");
exit(1);
}
else if(tasks[childnr].pid==0)
{
switch(childnr)
{
case 0:
close(pipe12[0]);
close(pipe23[0]);
close(pipe23[1]);
reader();
break;
case 1:
close(pipe12[1]);
close(pipe23[0]);
tokenizer();
break;
case 2:
close(pipe12[0]);
close(pipe12[1]);
close(pipe23[1]);
evaluator();
break;
default:
printf("childnr error\n"); //errorhandling
}
}
else
close(tasks[childnr].errorpipe[1]);
}
close(pipe12[0]);
close(pipe12[1]);
close(pipe23[0]);
close(pipe23[1]);
... continue with the parent
这是第一个孩子:
void reader(void)
{
atexit(*reader_exit);
if((readfile = fopen(calculatorfile,"r"))==NULL)
{
printf("R send error to errorHandler"); //errpipe!
exit(0);
}
char line[50];
const char *valid_characters = "0123456789 +-/*\n";
while(fgets ( line, sizeof line, readfile ) != NULL)
{
printf("R reading ...%s",line);
char *c = line;
while(*c)
{
if(!strchr(valid_characters,*c))
{
printf("R invalid character: %c in %s",*c,line);
line[0]=0;
break;
}
c++;
}
write(pipe12[1],line,sizeof line);
}
exit(0);
}
void reader_exit(void)
{
printf("R reader exit\n");
fclose(readfile);
close(pipe12[1]);
close(tasks[childnr].errorpipe[1]);
}
第二个孩子:
void tokenizer(void)
{
atexit(*tokenizer_exit);
char buffer[50];
while(read(pipe12[0],buffer,sizeof buffer)!=EOF)
{
printf("T %s",buffer);
char *token = strtok(buffer," ");
while(token!=NULL)
{
printf("T %s\n",token);
write(pipe23[1],token,sizeof token);
token = strtok(NULL, " ");
}
sleep(2);
}
exit(0);
}