int main_run()
{
int stat;
int i;
pid_t pid;
int fd[2];
char c;
if(setjmp(exit_jb))
goto shutdown;
//if(socketpair(AF_UNIX, SOCK_STREAM, 0, fd) < 0)
if(pipe(fd) < 0)
return errno;
while(1){
for(i=0; i<CHILD_NUM; i++){
if(childs[i].status != 0)
continue;
if((pid = fork()) < 0){
TRACE(fork, errno);
return errno;
}else if(pid == 0){
sleep(1);
close(fd[1]); //必须关闭写端,否则子进程收不到信号
stat = childs[i].child_main(fd[0], NULL);
exit(stat);
}else{
PRINTF("[main]:create child[%d]\n", pid);
childs[i].pid= pid;
childs[i].status = 1;
}
}
sleep(3);
check:
pid = waitpid(-1, NULL, WNOHANG);
if(pid > 0){
for(i=0; i<CHILD_NUM; i++){
if(pid == childs[i].pid){
childs[i].pid = 0;
childs[i].status = 0;
PRINTF("[main]:clear child[%d]\n", pid);
goto check;
}
}
}
}
shutdown:
write(fd[1], &c, 1); //确保子进程退出,即使没关写端
close(fd[1]);
return 0;
}
多进程框架
最新推荐文章于 2024-02-27 20:40:50 发布