等待 popen 脚本在 C 中终止

Wait for popen script to terminate in C

C 可以等到 popen 子进程完成吗?

我有一个由 C 守护程序启动的脚本,它会在触发外部信号时连接到 wifi 网络。

这是我现在的代码:

********************* Wait for external event here ***********************

if((fp = popen(CONNECTION_SCRIPT, "r")) == NULL)
{
    SYSLOG_ERR("[Error] Impossible to open pipe to execute  %s\n", CONNECTION_SCRIPT);
    exit(EXIT_FAILURE);
}

while(fgets(scriptBuffer, SCRIPT_BUF_SIZE, fp) != NULL)
{
    SYSLOG("[%s] %s", CONNECTION_SCRIPT, scriptBuffer);
}

if(pclose(fp))
{
    SYSLOG_ERR("[Error] Error with %s execution \n", CONNECTION_SCRIPT);
    exit(EXIT_FAILURE);
}

但是,我没有等待子进程完成,所以当我关闭管道时,资源很忙,因为脚本仍在写入。 有没有办法在读取管道并关闭它之前等待连接脚本结束?

我知道我可以通过分叉进程并等待子进程终止来做到这一点,但是仅仅为了同步线程就需要进行大量修改

我猜您说您收到了 "resource busy" 错误,因为当您在代码段的倒数第三行记录错误时 errno 的值为 EBUSY。这很可能会产生误导。

一般来说,如果确实有错误发生的迹象,您应该只检查 errno 的值。在 pclose 的情况下,该指示将是函数 return 正好是 -1(而不是任何非零值,就像您当前的代码一样)。

pclose 编辑的除 -1 return 以外的任何值都应解释为子进程的终止代码;在这种情况下,errno 将具有未指定(因此具有误导性)的值。您可以使用 WEXITSTATUSWIFSIGNALEDWTERMSIG 宏,如 waitpid 联机帮助页中所述,以解释 pclose 中的 return 值。

如其联机帮助页中所述,pclose 等待子进程终止,因此它已经执行了您的请求。如果 waitpid return 的使用出现错误(不太可能,但一切皆有可能),它将 return 实际错误指示 (-1)。