我正在启动一个进程,并将其输出重定向到命名管道。我正在使用cat > $pipe
重新连接到命名管道。当进程'stdout死亡而没有轮询父进程'死亡时,如何设置命名管道死?
除此之外,还可以使用cat
以外的其他内容来打开命名管道吗?
答案 0 :(得分:5)
一个fifo总是准备好来读写,所以像cat
和tail -f
这样的程序永远不会停止阅读。您要检查的是是否有一个进程写入该文件,如果没有这样的进程,请停止阅读。 (顺便说一下,读取文件的最佳方法是read
。)
lsof
可以告诉您从/向指定文件读取和写入的人员。查看其手册页,并尝试类似:
while lsof /path/to/fifo
do
read -r line < /path/to/fifo
printf "%s\n" "$line"
done
我不确定,也没有时间查看lsof,找出哪个选项只输出写到该文件的进程。请在手册页上查看。
因此,只要有一个写入fifo的进程,这个脚本就会读取一行并打印出来。一旦没有进程写入文件,循环就会中断并且脚本退出。
我不知道另一种检查是否有进程写入除lsof
以外的文件的方法。如果有人知道更标准的方式,我也想知道。
答案 1 :(得分:0)
cat > $pipe
写入管道,而不是从管道读取。
如果您想从管道中读取数据并在终端上打印,请尝试tail -f $pipe
。
-f
选项使tail
保持运行,并在将新数据写入管道时打印输出。
另请参阅Linux Journal的此article。