POSIX 环境中有很多可能的错误。为什么其中一些(特别是写入未连接的套接字)以信号的形式得到特殊处理?
最佳答案
这是设计使然,因此管道中使用的生成文本的简单程序(例如 find、grep、cat)会在它们的使用者死亡时死亡。也就是说,如果你正在运行一个像 find | grep | sed | head
这样的链,一旦它读取了足够多的行, head 就会退出。这将用 SIGPIPE 杀死 sed,用 SIGPIPE 杀死 grep,用 SEGPIPE 杀死 find。如果没有 SIGPIPE,天真编写的程序将继续运行并生成没人需要的内容。
如果您不想在程序中使用 SIGPIPE,只需调用 signal() 忽略它。在那之后,像 write() 这样的系统调用碰到一个损坏的管道将返回 errno=EPIPE 。
关于sockets - 为什么写入未连接的套接字首先发送 SIGPIPE?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1583871/