Разорвать цикл, который читает с канала fifo
Мне нужно смоделировать поведение оболочки в программе на C в UNIX, имея в виду одну важную вещь: родительский процесс получает все команды и отправляет их дочернему элементу. Затем ребенок выполняет полученную команду, а затем отправляет вывод отцу. Идея заключается в том, что я получил команду от родителя и моего основного дочернего fork(), чтобы его собственный потомок мог выполнить команду и отправить результат в канал fifo. Проблема в том, что я не могу разорвать цикл while (который выводит правильный вывод):
mkfifo("output",S_IFIFO|0644);
while(read(fifod2,&c,1))
printf("%c",c);
Я понимаю, что fifo имеет переменный размер, но второй дочерний элемент, должно быть, отправил EOF после завершения, так что, когда чтение достигает его, возвращает 0. Но этого, похоже, не происходит. Спросите меня, если потребуется, больше частей кода. Спасибо
1 ответ
Потому что родитель открыл свой конец пятерки с O_RDWR
есть процесс с записываемым файловым дескриптором в fifo. EOF происходит только тогда, когда нет никаких доступных для записи fd в fifo, и, так как родительский процесс сохраняет такой доступный для записи fd открытым, он никогда не получит EOF.
Попробуйте открыть с O_RDONLY
вместо родителей.