假设我们有一个名为 的命名管道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管道的运作中关系提出的指针open
,close
,read
和write
操作,我会非常感激。