通过信号的方式回收子进程

发布时间 2023-04-07 10:41:34作者: 信奉上帝的小和尚
#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;
}