Почему дочерний процесс не записывает свой стандартный вывод в канал каждый раз, когда генерируется строка?
Откуда ты это знаешь? Вы даже не пытаетесь прочитать вывод из fifo.
N.B. по имени файла я предполагаю, что вы используете fifo . Или это простой файл?
И незначительная ошибка у ребенка: после dup2()
необходимо close(outpipe)
.
fcntl (1, F_SETFL, fcntl (1, F_GETFL) | O_NONBLOCK);
В зависимости от того, какую программу вы выполняете (), вы можете либо потерять какой-то вывод, либо вызвать сбой программы, так как теперь запись в стандартный вывод может завершиться с EWOULDBLOCK.
IIRC fifos имеет тот же размер буфера, что и каналы. В POSIX минимум 512 байт, обычно 4K или 8K.
Вы, вероятно, хотите объяснить, зачем вам это вообще нужно. Неблокирующая IO имеет другую семантику по сравнению с блокирующей IO, и если ваш дочерний процесс не ожидает, что вы столкнетесь с различными проблемами.
printf ("ПРИВЕТ, МИР, Я ДЕТСКИЙ ПРОЦЕСС \ n");
stdout буферизован, я бы после этого fflush(stdout)
. (Не удается найти документацию, будет ли exec () самостоятельно очищать стандартный вывод или нет.)
Что-то мне не хватает в работе execvp или dup2? Я осознаю, что мой подход ко всему этому немного странный, но я не могу найти другой способ программной записи выходных данных двоичных файлов с закрытыми исходными кодами.
Я бы не стал играть с неблокирующим вводом-выводом - и оставил бы все как есть в режиме блокировки.
И я бы использовал pipe () вместо fifo. В Linux man pipe есть удобный пример с fork ().
В остальном это обычная практика.