Вот несколько вариантов, о которых я подумал, но не уверен, что это правильный вариант.
- Произошла ошибка чтения ввода-вывода из канала.
- Запись процесса на другой конец канала завершилась сбоем.
- Все процессы, которые могли писать в канал, закрыли его.
- Буфер записи канала заполнен.
- Пир закрыл другое направление дуплексной трубы.
- Запись не удалась, потому что нет процессов, которые могли бы читать из канала.
- Системный вызов вернул ошибку EPIPE, и обработчик ошибок не был установлен.
Ответы:
Процесс получает SIGPIPE, когда он пытается выполнить запись в канал (именованный или нет) или сокет типа SOCK_STREAM, у которого нет считывателя.
Это вообще желаемое поведение. Типичный пример:
Вы не хотите
find
продолжать работать после того,head
как завершили работу (а затем закрыли единственный файловый дескриптор, открытый для чтения по этому каналу).Команда
yes
обычно полагается на этот сигнал для завершения.Будет писать «y», пока не завершится какая-либо команда.
Обратите внимание, что это происходит не только при выходе из команд, но и тогда, когда все читатели закрыли чтение fd для канала. В:
Будет 1 (подоболочка), затем 2 (подоболочка + сон), затем 1 (подоболочка), затем 0 fd, считывающих из канала после того, как подоболочка явно закроет свой стандартный ввод, и именно тогда
yes
получит SIGPIPE.Выше, большинство оболочек использовать в
pipe(2)
то время какksh93
используетsocketpair(2)
, но поведение такое же в этом отношении.Когда процесс игнорирует SIGPIPE, запись системного вызова ( как правило
write
, но может бытьpwrite
,send
,splice
...) возвращается сEPIPE
ошибкой. Таким образом, процессы, желающие обработать сломанный канал вручную, обычно игнорируют SIGPIPE и предпринимают действия при ошибке EPIPE.источник
(6)
Хотя до тех пор, пока вы не продублируете дескрипторы и разветвление, может быть запущен только один процесс: обычно в канале есть один читатель и один писатель, и когда один из них закрывает соединение, канал не функционирует. Если вы используете именованный канал, вы можете создать с ним несколько соединений (последовательно), но каждый из них представляет новый канал в этом смысле. Таким образом, «канал» к потоку или процессу является синонимом дескриптора файла.
От
man 7 pipe
:Таким образом, «сломанная труба» для писателя - то же самое, что EOF для читателя.
источник
Сломанный канал возникает, когда процесс чтения завершается до процесса записи. Так что я бы пошел с (6)
источник