Если я правильно понимаю ваш код, он сделает следующее:
С первым fork
вы запустите ребенка, который читает из stdin и пишет в канал.
Ваш родительПроцесс читает из канала и записывает в FIFO.
Когда ваш родительский процесс завершил свой цикл, он вызывает второй fork
, чтобы создать другого дочернего элемента, который будет читать из FIFO и печатать данные.
Когда количество циклов слишком велико, вы достигнете предела буфера FIFO, и родительский блок заблокируется, потому что ни один процесс не читает из FIFO.Когда процесс блокируется при записи в FIFO, он никогда не создаст дочерний элемент, который, как ожидается, будет читать из FIFO.
Я думаю, что основная проблема заключается в том, что вы должны создать второго дочернего элемента до запуска цикла, который читаетданные из канала и записываются в FIFO.
Некоторые дополнительные замечания:
При cat /dev/urandom | ./a.out
ваша программа не читает /dev/urandom
напрямую.Он читает из канала, который может вести себя по-другому.
Вы всегда должны проверять возвращаемое значение read
.Он скажет вам, сколько байтов он прочитал, что может быть меньше, чем вы просили его прочитать.Если вы хотите иметь ровно 15 символов, вам может потребоваться прочитать несколько раз, если вы получите менее 15 символов.То же относится и к write
.