守护进程

一、守护进程的概念
守护进程又称精灵进程,是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或者等待处理某些发生的事件。守护进程是一种很有用的进程。
Linux的大多数服务器就是用守护进程实现的。例如:Internet服务器inetd,Web服务器httpd等。
守护进程完成许多系统任务。例如:作业规划进程crond等。
二、守护进程的创建
1.调用umask(0),将文件模式创建屏蔽字设置为0。
2.调用fork(),之后让父进程退出。
原因:1)如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止使得shell认为该命令已经执行完毕。
2)保证子进程不是一个进程组的组长进程。
3.调用setsid()创建一个新会话。
调用setsid()导致的结果:1)调用进程成为新会话的首进程。
2)调用进程成为一个进程组的组长进程。
3)调用进程没有控制终端。
4.将当前工作目录改为根目录。
5.关闭不需要的文件描述符表。
6.其他:忽略SIGCHLD信号。
三、代码实现

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>
void mydaemon()
{
    if(fork() > 0)
    {
        exit(0);
    }
    setsid();
    chdir("/");
    close(0);
    close(1);
    close(2);
    signal(SIGCHLD, SIG_IGN);
}

int main()
{
    umask(0);
    mydaemon();
    while(1);
    return 0;
}

四、fork()的创建次数
在一般的情况下,创建守护进程使用一次fork(),有的则会使用两次fork()。下面比较一下fork()一次和fork()两次的作用:
(1)调用一次fork的作用:
第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。
(2)第二次fork的作用:
虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。只有会话首进程能打开终端设备,也就是再fork一次终止父进程,保持子进程不是话首进程,从而保证后续不会再和其他终端关联

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值