子进程中使用 execl 的 waitpid 与 ECHILD 一起返回 -1?

kap*_*dit 0 c linux fork os.execl waitpid

如果我使用 execl 是可能需要时间完成的子进程,我什么时候需要使用 waitpid?

当我在父级中使用 waitpid 时,它让我的孩子运行,因为 waitpid 的返回值为 0。一段时间后,我试图在另一个函数中使用 waitpid,它用 ECHILD 返回 -1。如果我不确定天气孩子是否完成,我应该什么时候使用 waitpid?

//pid_t Checksum_pid = fork();
Checksum_pid = fork();

if (Checksum_pid == 0)
{
    execl(path, name, argument as needed, ,NULL);
    exit(EXIT_SUCCESS);     
}
else if (Checksum_pid > 0)
{ 
    pid_t returnValue = waitpid(Checksum_pid, &childStatus, WNOHANG);

    if ( returnValue > 0)
    {
        if (WIFEXITED(childStatus))
        {
            printf("Exit Code: _ WEXITSTATUS(childStatus)") ;               
        }
    }
    else if ( returnValue == 0)
    {
        //Send positive response with routine status running (0x03)
        printf("Child process still running") ; 
    }
    else
    {
        if ( errno == ECHILD )
        {
             printf(" Error ECHILD!!") ;
        } 
        else if ( errno == EINTR )
        {
            // other real errors handled here.
            printf(" Error EINTR!!") ;
        }
        else
        {
            printf("Error EINVAL!!") ;
        }       
    }
}
else
{   
    /* Fork failed. */
    printf("Fork Failed") ;
}
Run Code Online (Sandbox Code Playgroud)

小智 5

如果信号 SIGCHLD 被忽略(这是默认值)并且你跳过了乔纳森提到的 WNOHANG,waitpid 将挂起,直到孩子退出,然后以代码 ECHILD 失败。我自己在父进程应该等待子进程完成并且为 SIGCHLD 注册处理程序似乎有点矫枉过正的情况下遇到了这个问题。自然的后续问题是“在这种情况下是否可以将 ECHILD 视为预期事件,还是我总是应该为 SIGCHLD 编写处理程序?”,但对此我没有答案。

waitpid(2)文档中

爱奇艺

(对于waitpid() 或waitid()) pid (waitpid()) 或idtype 和id (waitid()) 指定的进程不存在或不是调用进程的子进程。(如果 SIGCHLD 的操作设置为 SIG_IGN,这可能会发生在自己的孩子身上。另请参阅有关线程的 Linux 注释部分。)

再往下

POSIX.1-2001 规定,如果 SIGCHLD 的处置设置为 SIG_IGN 或为 SIGCHLD 设置了 SA_NOCLDWAIT 标志(请参阅 sigaction(2)),则终止的子进程不会变成僵尸,并且调用 wait() 或 waitpid( ) 将阻塞,直到所有子进程都终止,然后失败,将 errno 设置为 ECHILD。(原始 POSIX 标准未指定将 SIGCHLD 设置为 SIG_IGN 的行为。请注意,即使 SIGCHLD 的默认处置是“忽略”,明确地将处置设置为 SIG_IGN 会导致对僵尸进程子进程的不同处理。)Linux 2.6 符合这一点规格。但是,Linux 2.4(及更早版本)不会:如果在忽略 SIGCHLD 时进行了 wait() 或 waitpid() 调用,则该调用的行为就像未忽略 SIGCHLD 一样,即,

另请参阅此答案