Здесь происходит то, что ядро блокирует процесс записи в системном вызове open(2)
, пока читатель не откроет его для чтения.(Для работы fifo требуется, чтобы оба конца были подключены к процессам). Как только читатель делает первый вызов read(2)
(либо блок записи, либо блок чтения, который первым получает системный вызов) Ядро передает все данные от модуля записи кчитатель, и пробуждает оба процесса (это причина получения только первого параметра командной строки, а не первых 16 байтов от пишущего устройства, вы получаете только шесть символов {'h', 'e', 'l', 'l', 'o', '\0' }
от блокирующего писателя)
Наконецпоскольку читатель просто закрывает fifo, писатель погибает с сигналом SIGPIPE
, поскольку читатели больше не открывают fifo.Если вы установите обработчик сигнала в процессе записи (или проигнорируете сигнал), вы получите сообщение об ошибке из системного вызова write(2)
, сообщающее, что больше нет читателей, заблокированных на fifo (значение EPIPE
errno) при блокировкеwrite.
Просто обратите внимание, что это функция, а не ошибка, способ узнать, что записи не будут доступны любому читателю, пока вы не закроете и снова не откроете fifo.
Ядро блокируетInode для fifo для всех вызовов read(2)
или write(2)
, поэтому даже другой процесс, выполняющий еще один write(2)
на fifo, будет заблокирован, и вы не получите данные о считывателе от этого второго автора (если выИмеется).Вы можете попробовать, если хотите, запустить двух авторов и посмотреть, что произойдет.
$ pru I am the best &
[1] 271
$ pru
Read 2 bytes: I
Wrote 2 bytes: I
Wrote 3 bytes: am
[1]+ Broken pipe pru I am the best <<< this is the kill to the writer process, announced by the shell.
$ _