等待popen脚本在C中终止

时间:2017-07-21 14:16:45

标签: c linux multithreading popen

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);
}

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

我知道我可以通过分配进程并等待子进程终止来实现它,但是为了同步线程需要进行大量的修改

1 个答案:

答案 0 :(得分:2)

我猜你说你遇到“资源忙”错误,因为expression在您在代码段的第三行最后一行记录错误时的值为errno。这可能会产生误导。

一般情况下,如果您有可靠的迹象表明发生了错误,则应该只检查EBUSY的值。在errno的情况下,该指示将是函数返回精确-1(而不是任何非零值,就像当前代码的情况一样)。

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

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