检查子进程是否已在 Unix 上的 C 中终止而没有阻塞

Check whether Child Process has terminated in C on Unix without blocking

我想检查在 Unix 上的 C 中子进程是否/何时终止。它不应该是阻塞的,而是循环中的简短检查。 我的代码:

pid_t pid = fork();
if (pid > 0)
    // Parent Process
    while (1) {
        // Do a short check whether Child has already terminated if yes break the loop.
    // Ik that it's possible to use waitpid(pid, &status, 0) but that blocks the whole loop until the child has terminated 

    }
if (pid == 0)
    printf("child process born");
    exit(0);

提前致谢

waitpid 的第三个参数是一组标志。如果您将 WNOHANG 传递给此参数,如果 children 尚未退出,则该函数将立即 return。

然后您可以检查 waitpid returned 0。如果是,则没有 child 退出,您等待并重试。

while (1) {
    pid_t rval = waitpid(pid, &status, WNOHANG);

    if (rval == -1) {
        perror("waitpid failed");
        exit(1);
    } else if (rval == 0) {
        sleep(1);
    } else {
        break;
    }
}

传统方式是:

#include <errno.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>

int exist(pid_t pid) {
   return kill(pid, 0) > 0 || errno != ESRCH;
}
int main(int ac, char **av) {
    while (--ac > 0) {
        pid_t p = strtol(*++av, 0, 0);
        printf("%d %s\n", p, exist(p) ? "exists" : "doesn't exist");
    }
    return 0;
}

它不关心 parent : child 关系(而 wait 导数关心),即使您没有影响进程的权限也能正常工作。