C语言守护进程实现

创建子进程,父进程退出

编写守护进程第一步,就是要使得进程独立于终端后台运行。为避免终端挂起,将父进程退出,造成程序已经退出的假象,所有后面的工作都在子进程完成,这样控制终端也可以继续执行其他命令,从而在形式上脱离控制终端的控制。

由于父进程先于子进程退出,子进程就变为孤儿进程,并由 init 进程作为其父进程收养。

子进程创建新会话

经过上一步,子进程已经后台运行,然而系统调用 fork 创建子进程,子进程便复制了原父进程的进程控制块(PCB),相应地继承了一些信息,包括会话、进程组、控制终端等信息。尽管父进程已经退出,但子进程的会话、进程组、控制终端的信息没有改变。为使子进程完全摆脱父进程的环境,需要调用 setsid 函数。

/* Daemonize a process */
void goDaemon()
{
    int fd;
    pid_t pid;                

    pid = fork();             
    if (pid < 0) {            
        merror(FORK_ERROR, errno, strerror(errno));
        return;               
    } else if (pid) {         
        exit(0);
    }  

    /* Become session leader */    
    if (setsid() < 0) {       
        merror(SETSID_ERROR, errno, strerror(errno));
        return;
    }  

    /* Fork again */          
    pid = fork();             
    if (pid < 0) {            
        merror(FORK_ERROR, errno, strerror(errno));
        return;               
    } else if (pid) {         
        exit(0);
    }  

    /* Dup stdin, stdout and stderr to /dev/null */
    if ((fd = open("/dev/null", O_RDWR)) >= 0) {
        dup2(fd, 0);          
        dup2(fd, 1);          
        dup2(fd, 2);          

        close(fd);            
    }  

    /* Go to / */             
    if (chdir("/") == -1) {   
        merror(CHDIR_ERROR, "/", errno, strerror(errno));
    }  

    nowDaemon();
}

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值