当没有什么可读的时候,如何使程序自行终止

时间:2018-03-09 14:20:54

标签: c bash unix

我正在使用此脚本运行C程序:

tail -f -n +1 input | ./output

我的计划是:

#include <stdio.h>
int main()
{
    printf("Hello world!");
    return 0;
}

它应该在运行后立即终止,因为此程序中没有任何内容可读。

但是会发生什么事情,除非我向我曾经重定向到我的程序的input提供一些输入,否则它会被终止。

为什么,我有这种行为?

1 个答案:

答案 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