Почему «cat / tmp / out1> / tmp / in2 &» отображается как «bash» с помощью команды «ps»?

Рассматривать:

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 появится в вашем дереве процессов.