检查子进程是否已在 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 导数关心),即使您没有影响进程的权限也能正常工作。
我想检查在 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 导数关心),即使您没有影响进程的权限也能正常工作。