我正在使用此脚本运行C程序:
tail -f -n +1 input | ./output
我的计划是:
#include <stdio.h>
int main()
{
printf("Hello world!");
return 0;
}
它应该在运行后立即终止,因为此程序中没有任何内容可读。
但是会发生什么事情,除非我向我曾经重定向到我的程序的input
提供一些输入,否则它会被终止。
为什么,我有这种行为?
答案 0 :(得分:2)
为什么,我有这种行为?
tail -f input
继续阅读input
并且不会关闭管道。当您的程序完成后,管道将变为已损坏,因为其读取端已关闭(由您的程序)。
如果tail
尝试写入管道,它将收到SIGPIPE
并将被杀死。否则tails
会挂起。
首先,尝试在tail -f -n +1
上单独运行stdin
:
$ tail -f -n +1
tail: warning: following standard input indefinitely is ineffective
通过查看-f
的手册页中的选项tail
:
-f
,--follow[={name|descriptor}]
随着文件的增长,输出附加数据;
因此,只需从-f
命令中删除tail
选项:
tail -n +1 input | ./output