想法:在主函数中创建多个进程处理后边的任务,然后如果创建的子进程有一个挂掉了,那么父进程捕获到子进程挂掉的信号,立即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);
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。