Я занят заданием, но я застрял. Я получаю ошибки, и я не понимаю, что я делаю неправильно.Ошибка инициализации канала C
Итак, в основном я делаю троих детей. Между первым и вторым у меня есть труба (pipe12
). Между вторым и третьим у меня есть труба (pipe23
). Теперь, когда первый ребенок() готов с чтением, он закрывает 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 = "-/*\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);
}
Вы можете улучшить общность вашего читателя, передав ему дескриптор файла: 'reader (pipe12 [1])'. Аналогично токенизатору: 'tokenizer (pipe12 [0], pipe23 [1]);' и оценщик: 'оценщик (pipe23 [0]);'. Для читателя вы также должны передать имя файла: 'reader (calculatorfile, pipe12 [1]);'. –
Спасибо, я сделаю это. – Kat
Как ребенок терпит крах? 'SIGPIPE' или' SIGSEGV'/'SIGBUS'? – C2H5OH