私は仕事で忙しいのですが、行き詰まっています。エラーが発生し、何が間違っているのかわかりません。
ですから、主に私は3人の子供を作ります。1番目と2番目の間にパイプ(pipe12
)があります。2番目と3番目の間にパイプ(pipe23
)があります。これで、最初の子(reader
)が読み取りの準備ができると、閉じますpipe12
が、2番目の子の読み取りは。を取得しませんEOF
。次に、2番目の子が書き込みを行う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]);
}
そして2番目の子供:
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);
}