【问题标题】:When and why should you use WNOHANG with waitpid()?何时以及为什么应该将 WNOHANG 与 waitpid() 一起使用?
【发布时间】:2015-05-04 14:25:04
【问题描述】:

我目前正在上系统编程课,今天我们讨论了等待系统调用函数。我正在阅读有关 waitpid() 系统调用的部分,并在选项部分中列出了一个名为 WNOHANG 的部分。

pid_t waitpid*(pid_t pid, int *status, int options);

WNOHANG:如果 pid 指定的子项(来自参数)尚未更改状态,则立即返回,而不是阻塞。在这种情况下,waitpid() 的返回值为 0。如果调用进程没有与 pid 中的规范匹配的子进程,则 waitpid() 将失败并返回错误 ECHILD。

我了解 waitpid() 是为了解决 wait() 中的限制而实现的;但是,我不太确定您为什么要使用 WNOHANG 选项标志。

如果我要进行猜测,那将是父进程可以执行其他任务,并且可能会继续检查其子进程以查看它们是否已终止。类似于恶魔进程如何在后台等待请求。

任何情境示例或常规示例也会有所帮助。

提前致谢!

【问题讨论】:

    标签: linux waitpid


    【解决方案1】:

    您无需继续检查孩子。这是 SIGCHLD 信号处理程序的工作。每次触发此处理程序时,您都会检查已终止的子项:

    pid_t pid;
    int status;
    while ((pid=waitpid(-1,&status,WNOHANG)) > 0)
    {
      //process terminated child
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 2010-12-07
      • 1970-01-01
      • 2014-05-22
      • 2016-02-04
      • 2023-03-08
      • 2013-01-29
      • 1970-01-01
      相关资源
      最近更新 更多