我有一个使用popen执行脚本的代码,它工作得很好,但随机地它会阻塞并使CPU达到100%,经过一点调查,我发现它挂在popen调用上。我在popen后面放了一个printf,显示已签名的描述符,在这种情况下,当它阻止时,这个printf永远不会显示。
什么会导致popen阻塞?
编辑:编码
FILE* pipe = popen(cpCommand, "r");
printf(....
if (pipe)
{
while (!feof(pipe))
{
if (DataReady(fileno(pipe),2500)>0)
{
if (fgets(output,sizeof(output),pipe) != NULL)
{
DataReady只是一个选择。。我在它阻塞后做了一个strace,它似乎什么都没做
不是答案;-)
-
尝试将
strace
用于它正在执行的操作以及挂起的系统调用。 -
Tterminal输出是行缓冲的,因此请确保使用fflush()或使用换行符(
fflush(stdout);
或printf("Debug textn");
)刷新输出,以确保它不会真正调用printf()。 -
手动运行脚本,并确保脚本在怀疑popen()之前不会间歇性挂起。
检查popen()
调用的脚本为什么没有结束。
只要脚本没有结束,popen()
块,就会说:不返回,正如观察到的那样。
我强烈怀疑这是一个C问题。