gpt4 book ai didi

c - 等待 popen 脚本在 C 中终止

转载 作者:太空狗 更新时间:2023-10-29 12:10:44 25 4
gpt4 key购买 nike

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

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

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

最佳答案

我猜你说你得到了一个“资源忙”错误,因为当你在你的片段。这很可能会产生误导。

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

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

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

关于c - 等待 popen 脚本在 C 中终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45239987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com