#include "stdio.h"
#include "sys/wait.h"
#include "signal.h"
#include "unistd.h"
#include "errno.h"
void wait_child(int sig) {
printf("接受到了信号:%d\n", sig);
int status;
// 如果同一时间收到相同的信号,只会保留一次,所以如果同一时间有很多子进程结束,就需要在一次信号里用死循环的方式来回收多个进程
for (;;) {
pid_t pid = waitpid(-1, &status, WNOHANG);
if (pid == -1) {
if (errno == ECHILD) {
printf("没有子进程可回收\n");
break;
} else {
perror("waitpid");
break;
}
} else if (pid == 0) {
printf("暂时没有子进程可回收\n");
break;
} else {
printf("%d进程回收了,状态为%d\n", pid, status);
}
}
}
int main(void) {
// 通过信号回收子进程
if (signal(SIGCHLD, wait_child) == SIG_ERR) {
perror("设置信号捕获错误");
return -1;
}
for (int i = 0; i < 5; i++) {
pid_t pid = fork();
if (pid == 0) {
sleep(i * 5 + 1);
return 0;
}
}
for (;;);
return 0;
}