2011-04-04 83 views
0

我想执行我在popen中创建的程序,然后收集输出。我执行的程序需要30秒(有30个睡眠(1)s),并在每秒钟后发送输出块。令我感到困惑的是,当我打电话给pipe = popen("test -flag", "r")时,它立即结束并且FILE流管道是空的。我是否假设程序将暂停并等待测试在继续执行之前完成执行,或者是否启动了收集输出的命令并立即继续?如果是后者,是否有任何方法暂停程序,直到管道在继续之前具有所有输出为止?管道流问题

谢谢!

+1

我敢打赌,你得到'/ bin/test'而不是'。/ test'。 – geekosaur 2011-04-04 00:26:11

+0

其实我的程序是位于“/ tmp/mytestfolder/test1”中的“test1”。将测试视为一般的exe文件 – 2011-04-04 00:28:12

+1

尝试用'/ bin/ls /'替换已知的工作。这将帮助您找出问题出在调用程序还是被调用程序中。 – 2011-04-04 00:34:37

回答

2

popen()的调用应该是相对较快的,所以程序可以继续读取程序的输出。当然,popen()本身并不等待被调用的程序完成。一旦popen()返回,您的程序应该能够从文件流中读取;它将挂起直到有输入等待,或者直到另一个进程关闭管道(例如终止),此时它将得到EOF指示。然后你可以从pclose()流中读取。

当您的测试程序直接运行并将其输出发送到管道时,您的测试程序如何运行?请注意,当输出为管道(完全缓冲)时,标准I/O的典型行为与终端(行缓冲)不同。

+0

它执行一个像20000次(但没有睡眠它在少于5秒内执行)的数学方程式。我可以暂停一下popen的来电吗? – 2011-04-04 00:40:14

+0

@Chris:你可以调用'sleep(30);'使它保持30秒,如果你想。然而,管道只有一个有限的(并且相当小的)容量 - 通常约为5 KiB - 所以你需要读取过程在管道满前读取;否则,另一个进程会阻塞,等待你的主进程做一些阅读。当然,如果主要进程只是从'popen()'返回的文件流中读取数据,那么您的主进程将会一直处于挂起状态直到有输入读取。 – 2011-04-04 00:44:24

+0

哇我觉得我是个白痴:P。我想我打开了这个文件,但是输入了从文件中提取chunk到文件中的步骤。所以可能是我没有得到和输出的原因是因为它引用了空白字符串。 Imma修改我的代码。我会在一秒钟内回复你。 – 2011-04-04 00:46:07

1

阅读pipe直到返回EOF

+0

这是我的坏人。我修好了,我感到很惭愧(对于这样一个愚蠢的问题,但是感谢你的帮助。 – 2011-04-04 00:59:10