Рассматривать:
mkfifo /tmp/out1 mkfifo /tmp/in2 cat /tmp/out1 > /tmp/in2 &
Когда я бегу
ps
он появляется как bash
в секции CMD
.
Зачем?
ps
перечисляет bash как запущенный процесс, потому что процесс bash заблокирован, пытаясь открыть fifo /tmp/in2
перед тем, как развернуть команду cat
. Поскольку bash
отвечает за обработку вашего перенаправления ( > /tmp/in2
), он должен сначала открыть /tmp/in2
чтобы впоследствии использовать системный вызов dup2
для изменения STDOUT
команды cat
в дескриптор файла для /tmp/in2
. К сожалению, вызов для open
блокирует в этом случае.
Если вы выполняете команду внутри strace:
strace -f bash -c "cat /tmp/out1 > /tmp/in2"
вы бы остановились на:
[pid 18457] open("/tmp/in2", O_WRONLY|O_CREAT|O_TRUNC, 0666
Он блокируется до тех пор, пока другой процесс не откроет файл для чтения. Согласно справочной странице fifo (7) :
Ядро поддерживает ровно один объект pipe для каждого специального файла FIFO, который открывается хотя бы одним процессом. FIFO должен быть открыт с обоих концов (чтение и запись), прежде чем данные могут быть переданы. Обычно открываются блоки FIFO, пока не открывается другой конец.
Процесс может открыть FIFO в неблокирующем режиме. В этом случае открытие только для чтения будет успешным, даже если никто еще не открыл на стороне записи, открытие только для записи завершится неудачно с ENXIO (нет такого устройства или адреса), если другой конец уже не открыт.
Если бы вы сначала открыли /tmp/in2
для чтения (например, добавив cat /tmp/in2 &
перед вашей последней командой cat), вы увидите, что ваша окончательная команда cat
появится в вашем дереве процессов.