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);
}
但是,我不是在等待子进程完成所以当我关闭管道时,资源很忙,因为脚本正在写入。 有没有办法在读入管道并关闭它之前等待连接脚本的结束?
我知道我可以通过分配进程并等待子进程终止来实现它,但是为了同步线程需要进行大量的修改
答案 0 :(得分:2)
我猜你说你遇到“资源忙”错误,因为expression
在您在代码段的第三行最后一行记录错误时的值为errno
。这可能会产生误导。
一般情况下,如果您有可靠的迹象表明发生了错误,则应该只检查EBUSY
的值。在errno
的情况下,该指示将是函数返回精确-1(而不是任何非零值,就像当前代码的情况一样)。
pclose
返回的除-1以外的任何值都应解释为子进程的终止代码;在这种情况下,pclose
将具有未指定(因此具有误导性)的值。您可以使用errno
联机帮助页中说明的WEXITSTATUS
,WIFSIGNALED
和WTERMSIG
宏来解释waitpid
的返回值。
如其联机帮助页中所述,pclose
等待子进程终止,因此它已经完成了您的请求。如果使用pclose
返回错误(不太可能,但一切皆有可能),它将返回实际错误指示(-1)。