等待 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
将具有未指定(因此具有误导性)的值。您可以使用 WEXITSTATUS
、WIFSIGNALED
和 WTERMSIG
宏,如 waitpid
联机帮助页中所述,以解释 pclose
中的 return 值。
如其联机帮助页中所述,pclose
等待子进程终止,因此它已经执行了您的请求。如果 waitpid
return 的使用出现错误(不太可能,但一切皆有可能),它将 return 实际错误指示 (-1)。
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
将具有未指定(因此具有误导性)的值。您可以使用 WEXITSTATUS
、WIFSIGNALED
和 WTERMSIG
宏,如 waitpid
联机帮助页中所述,以解释 pclose
中的 return 值。
如其联机帮助页中所述,pclose
等待子进程终止,因此它已经执行了您的请求。如果 waitpid
return 的使用出现错误(不太可能,但一切皆有可能),它将 return 实际错误指示 (-1)。