linux 下创建守护进程以及守护进程和后台进程的区别

  1. 什么是守护进程?
  2. 守护进程和后台进程的区别?
  3. 如何创建守护进程?

一:创建守护进程范例.

/**
 * 功能:创建一个守护进程
 * 
 * 守护进程编写规则:
 * (1)调用umask(0) --取消umask的功能
 * umask是个函数,用来限制(屏蔽)一些文件权限的.
 * (2)fork()一个子进程出来,然后父进程退出;固定套路.
 * 
 * 守护进程虽然可以通过终端启动,但是和终端不挂钩
 * 守护进程是在后台运行,它不应该从键盘上接收任何东西,也不应该把输出结果打印到屏幕或者终端上来.
 * 
 * 守护进程不会收到来自内核的 SIGINT(ctrl+c) ,SIGWINCH(终端窗口大小改变)信号.
 * 
 * 守护进程和后台进程的区别:
 * 1.守护进程和终端不挂钩,后台进程能往终端上输出东西
 * 2.守护进程和关闭终端时不受影响,后台进程会随着终端的退出而退出.
 */ 

#include 
#include 
#include 
#include 

#include 
#include 



int ngx_daemon()
{
    int fd;

    switch(fork())
    {
    case -1:
        //创建子进程失败,这里可以写日志......
        return -1;
    case 0:
        //子进程,走到这里直接break
        break;
    default:
        //父进程直接退出
        exit(0);
    }

    // 只有子进程流程才能走到这里.

    if (setsid() == -1)   //给子进程设置一个新的会话(这样终端退出时就不会杀死子进程)
    {
        //记录错误日志......
        return -1;
    }

    umask(0);   //设置为0,不要让它来限制文件权限

    //守护进程运行于后台,屏蔽从键盘上的输入消息
    fd = open("/dev/null",O_RDWR);          //打开黑洞设备,读写方式
    if(fd == -1)
    {
        // 记录错误日志......
        return -1;
    }

    if(dup2(fd,STDIN_FILENO) == -1) // 重定向键盘输入到黑洞
    {
        return -1;
    }

    if(dup2(fd,STDOUT_FILENO) == -1) // 重定向输出到黑洞
    {
        return -1;
    }

    if (fd > STDERR_FILENO)
    {
        if(close(fd) == -1)
        {
            return -1;
        }
    }

    return 1;
}


int main()
{
    if(ngx_daemon() != 1)
    {
        //创建守护进程失败
        return 1;
    }

    //守护进程创建成功.
    for(;;)
    {
        sleep(1);
        printf("休息一秒,进程id=%d \n", getpid());
    }

    return 0;
}

本篇文章我们将要弄明白这三个知识点.

二:什么是守护进程?和后台进程的区别?

我们一般把运行于后台,不依赖终端的进程称之为守护进程,因为运行于后台,那么自然也就不会接受来自键盘的输入,也不会像屏幕终端执行输出的操作了.

在解释守护进程的时候,我们先来说说—后台进程.

一般我们创建后台进程的时候是通过如下方式创建的:

在终端中输入./test & ,&就表示在后台运行,这样终端就可以继续收到输入的bash命令了.

但是如果我们关闭终端了,那么对应的后台进程也会被干掉.

这里有一个基本的概念知识,就是当我们关闭会话组的组长进程id的时候,内核会给这个会话组内的所有进程都发送SIGINT信号.

SIGINT也就是可以通过键盘的ctrl+c来进行处触发,同样的也会给在后台运行的进程发送SIGINT消息,如果我们不处理此消息,那么内核就会采取默认的操作来处理此信号,也就是杀死进程,从而导致僵尸进程的产生.

但是守护进程就不存在此问题,另外因为守护进程是运行于后台,因此也不会像屏幕上输出任何信息,也无法接受来自键盘的任何输入消息.

linux 下创建守护进程以及守护进程和后台进程的区别_第1张图片
查看进程的信息:

linux 下创建守护进程以及守护进程和后台进程的区别_第2张图片

你可能感兴趣的:(linux,c++,服务器编程)