писать у меня есть это:поведения трубы Unix/Linux при чтении процесса прекращается до процесса
$ ls -lh file
-rw-r--r-- 1 ankur root 181M Sep 23 20:09 file
$ head -6 file
z
abc
abc
abc
abc
abc
$ cat file | grep -m 1 z
z
Вопрос:
Почему cat
командная строка в последней строке не умирает преждевременно SIGPIPE? Я думаю, что это должно произойти, потому что grep
заканчивается в кратчайшие сроки по сравнению с cat file
, что кошки 183 МБ файла. С исчезновением процесса чтения cat
попытается написать разбитую трубу и должен умереть с SIGPIPE.
Update:
Я закончил тем, что писал это: readstdin.c
# include <unistd.h>
# include <stdio.h>
int main() {
ssize_t n ;
char a[5];
n = read(0, a, 3);
printf("read %zd bytes\n", n);
return(0);
}
Я использую это так:
$ cat file | ./readstdin
$ yes | ./readstdin
Но до сих пор cat
или yes
не умирает преждевременно. Я ожидаю, потому что процесс чтения заканчивается до того, как процесс записи будет выполнен.
'Да' умирает, иначе он остался бы навсегда ... –
Как сказал Базиле Старинкевич, процессы' cat' и 'yes' получают сигнал' SIGPIPE' и погибают. Статус выхода конвейера - это статус выхода финальной команды (т. Е. 'Grep'), поэтому, если более ранняя команда не работает, вы не увидите этого в статусе выхода. Почему вы думаете, что они не умирают преждевременно? –
@AdamRosenfield Что заставляет вас думать, что они не умирают преждевременно, так это то, что я не вижу сообщение об ошибке, напечатанное на экране от 'cat' или' yes', они просто молча выходят. Но это может быть то, как они реализованы для обработки SIGPIPE. – abc