是否`echo -n | ...` 向管道发送 EOF?

Hap*_*ace 4 shell pipe file-descriptors cat stdin

是否echo -n | ...向管道发送 EOF?IE,

echo -n | sth
Run Code Online (Sandbox Code Playgroud)

sth在其标准输入上收到 EOF 吗?

Pau*_*ant 11

没有 EOF 表示为文件或流中的数据。它只是与文件描述符相关联的状态。

当 echo 终止时(几乎是立即终止),管道的写端关闭。

下一次sth读取(假设它已经读取了之前写入文件的所有数据)管道状态更改为 EOF 并且发出的读取sth返回带有 EOF 条件。该进程可以继续进行它需要的任何处理,只是不能再从管道中读取任何内容。


Gil*_*il' 5

是的。当写入管道的程序关闭写入端时,从管道读取的程序会看到管道上的文件结尾。更准确地说,当管道上打开的最后一个文件描述符关闭时,文件结束事件就会发生。关闭文件描述符的方法包括显式关闭和进程退出。

这里只有一个进程写入管道并运行echo -n,这取决于 shell 要么写入-n并换行,要么什么也不写入。当该进程完成写入并退出时,管道的写入端将关闭,因此sth会在管道上看到 EOF。(也有可能 shell 在不分叉的情况下运行管道的左侧,在这种情况下,shell 在完成写入后显式关闭管道:此优化对管道的右侧没有任何影响.)


pin*_*ime 5

没有要发送或接收的 EOF。

EOF 只是一个 api 小说,只存在于 stdio 库中。它是FILE*stdio 输入流的状态标志,通常read(2)在对底层文件描述符的系统调用返回后设置0。还有一个宏,-1它是在fgetc(3)EOF 标志打开的输入流上调用时由类似函数返回的值。

虽然您可以将“发送 EOF”比喻为“间接导致一些未来read(2)返回0”,但这是非常草率的,并且会造成错误的印象,即 EOF 是某种内联信号,或者底层文件描述符或设备的状态可以从另一端设置。

在管道上,read(2)将返回0如果

  1. 管道缓冲区为空,并且
  2. 它的写入端没有打开的句柄

这两个条件都是瞬态的,这与 EOF 条件在常规文件或终端上瞬态的方式一致。

特别要注意的是,在 Linux 上,所有的管道都是有效的命名管道:只要一个进程仍然有一个打开管道端的句柄,你也可以通过在写模式下打开管道来恢复它的/proc/<pid>/fd/<fd>。虽然这在其他系统上可能不是那么容易,但在“匿名”管道上具有粘性 EOF 并不是其界面的一部分。