想法:在主函数中创建多个进程处理后边的任务,然后如果创建的子进程有一个挂掉了,那么父进程捕获到子进程挂掉的信号,立即fork重新创建子进程然后接着处理后边的任务。
但是实际测试的结果是,子进程挂掉后,父进程会再创建子进程,但是创建的子进程不会处理任务,不知道是为什么?
主函数中的创建进程代码:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
首先,在父进程,只要执行一次signal(SIGCHLD, fork_child)就可以了,并不需要循环注册这个signal handler。
另外,你在fork_child里,if (child_process == 0) { exit(0); },意味着fork出来的子进程马上exit,当然不会继续执行了。
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
 
#define CHILD_SIZE 5
#define BUF_SIZE 100
static void child_process();
 
int main()
{
    int num_child = 0;
    pid_t pid;
    char buf[100];
    int count = 0;
    int n;
 
    while(1) {
        while (num_child < CHILD_SIZE && count < 20) {
            pid = fork();
            if (pid == 0) {
                child_process();
            } else if (pid < 0) {
                write(1, "ERR: fork()\n", sizeof("ERR: fork()\n")-1);
                break;
            } else {
                n = snprintf(buf, BUF_SIZE, "Process %d Created.\n", pid);
                write(1, buf, n);
            }
            num_child++;
            count++;
        }
 
        pid = wait(NULL);
        if (pid == -1) break;
        n = snprintf(buf, BUF_SIZE, "Process %d End.\n", pid);
        write(1, buf, n);
        num_child--;
    }
    return 0;
}
 
static void child_process()
{
    sleep(random()%5);
    exit(0);
}