daemon 进程为什么要fork两次,与后台运行程序区别?

守护进程在Linux中常用于后台运行服务。本文详细解析了daemon进程为何需要fork两次以及setsid的重要性,旨在阐述如何防止终端信号导致进程退出。通过示例解释了fork和setsid的作用,并对比了守护进程与后台程序的区别。
摘要由CSDN通过智能技术生成
 daemon进程是后台守护进程.linux 下server都是daemon进程。相信大部分开发人员都知道如何去写一个daemon进程。但是另一方面,大部分人不知道为什么要这么做,不少人是从某个地方copy一个函数。但是具体为什么这么实现,却不是很透彻。 daemon函数存在的原因是因为控制终端由于某些原因(如断开终端链接)会发送一些信号的原因。而接收进城处理这些信号缺省动作会让进程退出。这些信号会由于终端上敲一些特殊按键而产生。

贴一个daemon函数常见的实现:
int daemon(void)
{
    pid_t pid = fork();
    if( pid != 0 ) exit(0);//parent
    //first children
    if(setsid() == -1)
    {
       printf("setsid failed\n");
       assert(0);
       exit(-1);
    }
    umask(0);
    pid = fork();
    if( pid != 0) exit(0);
    //second children 
    chdir ("/");
    for (int i = 0; i < 3; i++)
    {
        close (i);
    }
    int stdfd = open ("/dev/null", O_RDWR);
    dup2(stdfd, STDOUT_FILENO);
    dup2(stdfd, STDERR_FILENO);
    return 0;
}

1 、第一次fork的作用是让shell 认为本条命令 已经终止,不用挂在终端输入上。还有一个作用是为后面setsid服务。setsid的调用者不能是进程组组长(group leader). 此时父进程是进程组组长。
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值