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 条件。该进程可以继续进行它需要的任何处理,只是不能再从管道中读取任何内容。
是的。当写入管道的程序关闭写入端时,从管道读取的程序会看到管道上的文件结尾。更准确地说,当管道上打开的最后一个文件描述符关闭时,文件结束事件就会发生。关闭文件描述符的方法包括显式关闭和进程退出。
这里只有一个进程写入管道并运行echo -n
,这取决于 shell 要么写入-n
并换行,要么什么也不写入。当该进程完成写入并退出时,管道的写入端将关闭,因此sth
会在管道上看到 EOF。(也有可能 shell 在不分叉的情况下运行管道的左侧,在这种情况下,shell 在完成写入后显式关闭管道:此优化对管道的右侧没有任何影响.)
没有要发送或接收的 EOF。
EOF 只是一个 api 小说,只存在于 stdio 库中。它是FILE*
stdio 输入流的状态标志,通常read(2)
在对底层文件描述符的系统调用返回后设置0
。还有一个宏,-1
它是在fgetc(3)
EOF 标志打开的输入流上调用时由类似函数返回的值。
虽然您可以将“发送 EOF”比喻为“间接导致一些未来read(2)
返回0
”,但这是非常草率的,并且会造成错误的印象,即 EOF 是某种内联信号,或者底层文件描述符或设备的状态可以从另一端设置。
在管道上,read(2)
将返回0
如果
这两个条件都是瞬态的,这与 EOF 条件在常规文件或终端上瞬态的方式一致。
特别要注意的是,在 Linux 上,所有的管道都是有效的命名管道:只要一个进程仍然有一个打开管道读端的句柄,你也可以通过在写模式下打开管道来恢复它的写端/proc/<pid>/fd/<fd>
。虽然这在其他系统上可能不是那么容易,但在“匿名”管道上具有粘性 EOF 并不是其界面的一部分。