Linux——守护进程(精灵进程)创建fork一次.两次的区别

要知其后者,必须先知道守护进程是什么东西。

守护进程:守护进程也称精灵进程( Daemon),是运⾏在后台的⼀种特殊进程。它独⽴于控制终端并且周期性地执⾏某种任务或等待处理某些发⽣的事件。守护进程是⼀种很有⽤的进程。它不属于任何控制终端,即不受回话的影响,不能与用户进行直接交互,不受用户登录注销的影响。

那么,创建守护进程为什么要通过fork创建子进程而不是直接创建呢?
因为当前进程不允许是进程组的Leader,要保证当前进程不是进 程组的Leader也很容易,只要先fork再调⽤setsid就⾏了。 fork创建的⼦进程和⽗进程在同⼀个进 程组中,进程组的Leader必然是该组的第⼀个进程,所以⼦进程不可能是该组的第⼀个进程,在⼦ 进程中调⽤setsid就不会有问题了。
注:setsid函数为创建守护进程最关键的⼀步,创建⼀个新Session,并成为Session Leader。
那么,如何创建一个守护进程呢?创建一个守护进程大概需要几步呢,以下:
1. 调⽤umask将⽂件模式创建屏蔽字设置为0.
2. 调⽤fork,⽗进程退出( exit) 。
3. 调⽤setsid创建⼀个新会话。
4. 将当前⼯作⽬录更改为根⽬录。
5. 关闭不在需要的⽂件描述符。
6. 其他:忽略SIGCHLD信号。
代码示例如下:(仅进行了一次fork)

#include
#include
#include
#include

void create_daemon()
{
    pid_t pid = fork();
    struct sigaction sa;
    umask(0);
    if(pid > 0)
    {
        exit(0);
    }
    setsid();

    if(chdir("/")<0)
    {
        printf("error\n");
    }

    sa.sa_handler = SIG_IGN;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    sigaction(SIGCHLD,&sa,NULL);
    close(0);
    close(1);
    close(2);

}
int main()
{
    create_daemon();
    while(1)
    {}
    return 0;
}

要知道在创建守护进程的时候fork一次和fork两次两者有什么区别,就要先知道第一次fork和第二次fork都起到了什么作用:
(1)调用一次fork的作用:
第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。
(2)第二次fork的作用:
虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。
只有会话首进程能打开终端设备,也就是再fork一次,再把父进程退出,再次fork的子进程作为守护进程继续运行,保证了该精灵进程不是对话期的首进程,
第二次不是必须的,是可选的,市面上有些开源项目也是fork一次

你可能感兴趣的:(linux)