多进程框架

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值