小编Naï*_*ier的帖子

SIGPIPE 究竟在什么条件下发生?

假设我们有一个名为 的命名管道fifo,我们正在从两个不同的 shell 读取和写入它。考虑这两个例子:

shell 1$ echo foo > fifo
<hangs>
shell 2$ cat fifo
foo
shell 1$ echo bar > fifo
<hangs>
Run Code Online (Sandbox Code Playgroud)
shell 1$ cat > fifo
<typing> foo
<hangs>
shell 2$ cat fifo
foo
^C
shell 1$
<typing> bar
<exits>
Run Code Online (Sandbox Code Playgroud)

我无法理解这些示例中发生了什么,特别是为什么在第一个示例中尝试将“bar”写入管道会导致阻塞调用,而在第二个示例中它会触发 SIGPIPE。

我知道在第一种情况下,两个单独的进程写入管道,因此它被打开两次,而在第二种情况下,它只被一个进程打开一次并写入两次,进程从管道中读取在此期间被杀害。我不明白的是这如何影响write.

pipe(7)手册页指出:

如果所有引用管道读取端的文件描述符都已关闭,则写入(2) 将导致为调用进程生成 SIGPIPE 信号。

这个条件对我来说听起来不太清楚。一个封闭的文件描述符只是不再是一个文件描述符,对不对?说“管道的读数端已关闭”与“管道的读数端未打开”有何不同?

我希望我的问题足够清楚。顺便说一句,如果你能在详细了解UNIX管道的运作中关系提出的指针openclosereadwrite操作,我会非常感激。

pipe signals fifo read-write

6
推荐指数
1
解决办法
1万
查看次数

标签 统计

fifo ×1

pipe ×1

read-write ×1

signals ×1