По сути, у меня есть несколько дочерних элементов, сгенерированных циклом for с fork (). Предположим, что 5 детей родились. И родитель отправит математические уравнения детям один за другим через трубу (всего 20 уравнений). И дети вычисляют результат уравнения и выводят его в файл.
Однако цикл while не заканчивается, даже если все уравнения были вычислены.
у ребенка:
while(read(pipes[procid][0], buf, MAIN_BUF_LEN) > 0){
exp_readln(&exp, buf);//Change the string into Expression class
result = exp_cal(&exp);//Calculate the result
printf("Recieved: #%d %d %0.3f\n", procid, mypid, result);
fprintf(outfileptr, "#%d %d %0.3f\n", procid, mypid, result);
fflush(outfileptr);
}
printf("Exit loop\n");
close(pipes[procid][0]);
exit(0);
В родительском:
i = 0;
while (fd_readln(fileno(infileptr), buf, MAIN_BUF_LEN) > 0){
printf("Sent %d: %s\n", i, buf);
dprintf(pipes[i][1],"%s\n", buf);
i = i + 1;
if (i >= proc){
i = 0;
}
}
Ожидаемый результат состоит в том, что после того, как ребенок получил и обработал все уравнения, он выведет результат вычисления. И это сделал. Однако он не выводит оператор «Выходной цикл», показывая, что программа осталась в цикле while, даже если через канал больше не поступают данные / уравнения.
Итак, как мне решить эту проблему?