在C中使用popen调用ping

时间:2015-03-19 01:49:46

标签: c linux ping

我在CentOS linux的C代码中有以下代码。此代码在线程中每5秒调用一次。如果我禁用pclose(fp),代码工作正常,但我知道我应该这样做。当我启用它时,有人可以解释为什么它挂在pclose(fp)上吗? 非常感谢。

FILE* fp;
int status;
char path[255];

fp = popen("ping -c 3 -W 3 200.0.0.51", "r");
sleep(3); 
int i=0; 
while (i < 255) {
    path[i] = fgetc(fp); 
    i++;
}

char* str;
str = strstr(path, "100% packet loss");

if (str!=NULL) {
    //pclose(fp); // <--- hangs here if I enable
    OS_Reboot(); 
}

3 个答案:

答案 0 :(得分:2)

问题似乎是pclose()仅在从popen创建的进程终止时才返回,但是ping会一直循环。

  

在任何情况下,pclose()都不会在popen()创建的子进程终止之前返回

解决方案是自己分叉进程并为返回到进程的stdin和stdout创建管道。另一个stackoverflow成员显示here的可能实现。

答案 1 :(得分:2)

在启用了pclose的情况下,发布的代码对我来说很好(我还删除了分支以确保它被调用)。注意&#34; pclose()函数等待关联的进程终止并返回wait4(2)&#34;返回的命令的退出状态。 (from the docs)所以它可能是&#34; ping -c 3 -W 3 200.0.0.51&#34;实际上是挂在你的机器上(不知道为什么会这样)。

答案 2 :(得分:2)

只有当ping没有终止时才会出现您所看到的行为,因为-c 3发送了三个数据包后,您应该这样做。

您应该在调用中添加-n以避免在连接断开时陷入DNS查找?