WNOHANG在Waitpid功能中的宏观

时间:2015-10-08 12:02:55

标签: c linux unix system-calls

程序:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>

int main()
{
    int pid=fork();
    if(pid==0){
        printf("Child Executing: PID = %d\n",getpid());
        pause();
    }
    else{
        printf("Parent waiting: PID = %d\n",getpid());
        int status;
        waitpid(pid,&status,WNOHANG);
        if(WIFEXITED(status))
            printf("Child Terminates Normally\n");
        else if(WIFSIGNALED(status))
            printf("Child terminated by signal\n");
    }
}

在上面的程序中,我将WNOHANG宏传递给waitpid函数的选项参数。它不等待子进程 去完成。那么,wnohang的用途是什么。手册页包含以下语句

WNOHANG return immediately if no child has exited.

我不明白其确切含义。那么,WNOHANG的用途是什么,我们在哪里使用它。是否有WNOHANG的实时使用案例。

先谢谢。

2 个答案:

答案 0 :(得分:3)

如果您定期轮询以查看流程是否已退出,则可以使用此功能。如果它还没有继续你的其余程序:

while (some_condition) {
    result = waitpid(pid, &status, WNOHANG);
    if (result > 0) {
        // clean up the process
    } else if (result < 0) {
        perror("waitpid");
    }
    // do other processing
}

答案 1 :(得分:1)

如果您希望父进程在子状态未更改的情况下继续执行一些有用的工作,那么(WNOHANG)非常有用。

一个常见的例子是在shell中实现job control。 通常,shell(父进程)通过调用waitpid()而不阻塞自身来定期检查任何后台进程(子进程)状态更改的状态。请参阅Stopped and Terminated Jobs了解一个人为的例子。