【问题标题】:Calling ping using popen in C在 C 中使用 popen 调用 ping
【发布时间】:2015-03-19 01:49:45
【问题描述】:

我在 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(); 
}

【问题讨论】:

    标签: c linux ping


    【解决方案1】:

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

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

    一种解决方案是自己派生进程并为返回到您的进程的标准输入和标准输出创建管道。 here 由另一个 stackoverflow 成员实现。

    【讨论】:

    • 是的,它应该,但它似乎不是以某种方式。
    • 谢谢。我将其更改为 ping -c 1 -W 1 195.0.0.1 并且现在可以使用。可能对 popen 的 ping 处理没有足够快地终止?
    • 是的,也许它比预期的终止时间更长。
    • 还有一个问题:popen 进程是否受我的 sleep(3) 语句影响?或者只是让我运行这个函数的线程休眠?
    • 如果我没记错的话,fopen会创建一个像fork这样的新进程,所以它不应该受到睡眠的影响。
    【解决方案2】:

    在启用 pclose 的情况下,发布的代码对我来说可以正常工作(我还删除了分支以确保它会被调用)。请注意,“pclose() 函数等待相关进程终止并返回由 wait4(2) 返回的命令的退出状态”(from the docs),因此可能是“ping -c 3 -W 3 200.0 .0.51" 实际上挂在你的机器上(不知道为什么会这样)。

    【讨论】:

      【解决方案3】:

      您看到的行为应该仅在ping 没有终止时发生,在您的情况下,由于-c 3,它应该在发送三个数据包后发生。

      您可能应该在调用中添加-n 以避免在您的连接中断时卡在 DNS 查找中?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多