我有一个二进制程序*,它获取所提供文件的内容,对其进行处理,并通过标准输出在屏幕上打印结果。对于自动化脚本,我想使用命名管道将数据发送到该程序并自己处理输出。在尝试让脚本工作后,我意识到二进制程序从命名管道接受数据存在问题。为了说明这个问题,我概述了几个使用 unix shell 的测试。
很容易证明程序通过处理实际数据文件来工作。
$ binprog file.txt > output.txt
这将导致 output.txt 包含来自 file.txt 的已处理信息。
如本演示所示,命名管道 (pipe.txt) 的工作原理。
$ cat pipe.txt > output.txt $ cat file.txt > pipe.txt
这将导致 output.txt 在通过管道发送后包含来自 file.txt 的数据。
当二进制程序从命名管道而不是文件读取时,事情不能正常工作。
$ binprog pipe.txt > output.txt $ cat file.txt > pipe.txt
在这种情况下,即使 cat 和 binprog 终止, output.txt 也不包含任何数据。使用 top 和 ps,我可以看到 binprog “运行”并且似乎在工作。一切都执行没有错误。
为什么在第三个示例中 binprog 没有输出?
我可以尝试哪些事情来使它正常工作?
[*] 有问题的程序是来自libsvm的 svm-scale 。我选择概括示例以保持它们的简洁。