我忙于一项任务,但我被困住了。我犯错,我不明白我做错了什么。
所以在主体中,我生三个孩子。在第一个和第二个之间,我有一个管道( ipop12
)。在第二个和第三个之间,我有一个管道( ipop23
)。当第一个孩子( reader
)准备好阅读的时候,它关闭了 ipop12
,但第二个孩子的阅读没有获得 EOF
。第二个孩子想写到 ipop23
,儿童崩溃。
我想我做错了什么 管道初始化,但什么?
这是父父( 父)
for(childnr=2; childnr>=0;childnr--)
{
tasks[childnr].pid=fork();
if(tasks[childnr].pid==-1)
{
printf("fork error
");
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
"); //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 +-/*
";
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
");
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
",token);
write(pipe23[1],token,sizeof token);
token = strtok(NULL, " ");
}
sleep(2);
}
exit(0);
}