What makes a Unix process die with Broken pipe?

Here are some options I thought of, not sure which is the right one.

a) There was an I/O error reading from the pipe.

b) The process writing to the other end of the pipe died with a failure.

c) All processes who could write to the pipe have closed it.

d) The write buffer of the pipe is full.

e) The peer has closed the other direction of the duplex pipe.

f) Writing failed because there are no processes which could read from the pipe.

g) A system call returned the EPIPE error, and there was no error handler installed.

share improve this question
 
 
What's your question? Are you asking which of those is correct, or if there are any other things that can cause the broken pipe? –   EightBitTony  Jul 29 '13 at 15:15
 
@EightBitTony Which of these is correct –   siamii  Jul 29 '13 at 15:16

3 Answers

A process receives a SIGPIPE when it attempts to write to a pipe (named or not) or socket of type SOCK_STREAM that has no reader left.

It's generally wanted behaviour. A typical example is:

find . | head -n 1

You don't want find to keep on running once head has terminated (and then closed the only file descriptor open for reading on that pipe).

The yes command typically relies on that signal to terminate.

yes | some-command

Will write "y" until some-command terminates.

Note that it's not only when commands exit, it's when all the reader have closed their reading fd to the pipe. In:

yes | ( sleep 1; exec <&-; ps -fC yes)
      1 2       1        0

Their will be 1 (the subshell), then 2 (subshell + sleep), then 1 (subshell) then 0 fd reading from the pipe after the subshell explicitely closes its stdin, and that's when yes will receive a SIGPIPE.

Above, most shells use a pipe(2) while ksh93 uses a socketpair(2), but the behaviour is the same in that regard.

When a process ignores the SIGPIPE, the writing system call (generally write, but could be pwritesendsplice...) returns with a EPIPE error. So processes wanting to handle the broken pipe manually would typically ignore SIGPIPE and take action upon a EPIPE error.

share improve this answer
 

(f)

Writing failed because there are no processes which could read from the pipe.

Although unless you duplicate descriptors and fork, there can only be one process to start with: generally a pipe has one reader and one writer, and when one of them closes the connection, the pipe is defunct. If you are using a named pipe, you can can make multiple connections (in serial) with it, but each one represents a new pipe in this sense. So a "pipe" to a thread or process is synonymous with a file descriptor.

From man 7 pipe:

If all file descriptors referring to the read end of a pipe have been closed, then a write(2) will cause a SIGPIPE signal to be generated for the calling process. If the calling process is ignoring this signal, then write(2) fails with the error EPIPE.

So a "broken pipe" is to the writer what EOF is to the reader.

share improve this answer
 
4 
It's not always a mistake. The yes command relies on SIGPIPE to terminate, the head command generally causes SIGPIPEs to be sent. –   Stéphane Chazelas  Jul 29 '13 at 16:27

A broken pipe happens when the reading process exits before the writing process. So I would go with (f)

share improve this answer
 
 
There can be several processes reading or writing to a pipe, and the same process can be reading and writing. Also, it's not about exiting, it's about closing the file descriptor. –   Stéphane Chazelas  Jul 29 '13 at 16:26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值