Как исправить отсутствие выхода из цикла while для получения данных канала в дочернем процессе? - PullRequest
0 голосов
/ 28 марта 2019

По сути, у меня есть несколько дочерних элементов, сгенерированных циклом 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, даже если через канал больше не поступают данные / уравнения. Итак, как мне решить эту проблему?

...