在产生许多孩子的过程中,我有一个SIGCHLD处理程序。

这段代码在我的处理程序中,pid始终为1。我读过pid应该是子进程id。为什么我继续找回1

int status;
pid_t pid;

while(pid = waitpid(-1, &status, WNOHANG) > 0)
{
    if  (WIFEXITED(status))
        printf("Child %ld: Ended properly and returned %d\n", pid, WEXITSTATUS(status));
    else
        printf("Child crashed\n");
}


初始化处理程序的代码。

void initSIGCHLDSignalHandler()
{
    struct sigaction act;

    memset(&act,'\0',sizeof(struct sigaction));
    sigemptyset(&act.sa_mask);
    act.sa_flags = SA_NOCLDSTOP | SA_RESTART;
    act.sa_handler = SIGCHLD_SignalHandler;

    sigaction(SIGCHLD, &act, NULL);
}

最佳答案

我想你想要

while((pid = waitpid(-1, &status, WNOHANG)) > 0)


因为现在您获得的只是“真实”。 (您的编译器可能会对此发出警告,因此请阅读编译器警告。)

关于c - 为什么waitpid()对于所有子进程仅返回1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21666554/

10-11 19:11