我在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();
}
答案 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查找?