即使管道关闭后,如何继续从管道读取数据?

即使管道关闭后,如何继续从管道读取数据?

我有一个 ksh 脚本,它调用:

while read LINE do...

输入已被重定向(未显示),以便它从管道读取输入。

问题是,当管道写入器关闭时,read 返回 false 并退出循环。

我希望它在管道关闭后继续读取(写入过程可能会时不时重新启动,从而导致这种情况)。

我尝试将整个读取行包装在一个子 shell 中并循环遍历整个子 shell,但是读取在管道关闭后只会得到一个空行,而不是像脚本正常启动时那样阻塞直到有更多输入。

答案1

管道是在内核中创建的,是两个进程之间的一种通信方法。它通常是父/子关系。如果一个进程退出,则没有管道。内核中没有办法将另一个进程附加到管道的另一端。内核会自动关闭管道,并将 EPIPE 提供给任何读取者。

要做的是创建一个命名管道。它存在于文件系统中,退出任何写入程序时都不会关闭。您甚至可以有多个写入器到管道,尽管我不建议这样做 - 您认为正在写入的“块”由于缓冲而被写入不同的块中。

您可以在已知目录中创建管道,mkfifo /path/to/pipe然后根据您是读者还是写者将 stdin 或 stdout 重定向到该管道或从该管道重定向到该管道。

答案2

一旦管道关闭,就无法重新打开。我不知道文件系统上命名管道的所有细节,但如果你只是做类似的事情,cat somefile.txt | myprogram那么一旦cat关闭管道,管道就消失了。

相关内容