自学内容网 自学内容网

【网络】守护进程


一、前后台进程介绍(linux进程间的关系)

1、前台进程

在这里插入图片描述
什么叫做前台?什么叫做后台?
不论前台还是后台都能向显示器打印,谁拥有键盘文件,谁就是前台!键盘只有一个所以就只有一个前台。

2、后台进程(fg,bg,jobs使用)

在这里插入图片描述

3、任务和进程组的关系

在这里插入图片描述
属于同一个会话(用谁的xshell去访问使用)任务是前后台都有的任务,琴台任务只有一个,后台任务有多个,任务分发给进程组,进程组可以自称一组也可以几个进程一起合并成为一组。

(1)登录

我张三登录以后,系统会以bash这个任务的ID为命名构建一个会话,这些进程组和任务都会放在一个会话中!

(2)退出

在这里插入图片描述
我们不想受到任何用户的登录和注销的影响的话就要守护进程化。

注销:把会话全部删掉,所以守护进程怎么做?
在这里插入图片描述

二、守护进程

在这里插入图片描述
步骤:忽略异常信号->将自己设置为独立session->更改文件的目录->将标准输入标准输出标准错误重定向到/dev/null这个垃圾桶文件中。

#pragma once 

#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <string>

const std::string nullfile = "/dev/null";

void _Daemon(const std::string& cwd = “”)
{
    // 1.忽略其他信号
    signal(SIGCLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);
    signal(SIGSTOP, SIG_IGN);
    // 2.将自己设置为独立会话
    if (fork() > 0) exit(0); // 父进程直接退出
    setsid();
    // 3.更改文件的目录
    if (!cwd.empty()) chdir(cwd.c_str());
    // 4.将标准输入标准输出标准错误重定向到/dev/null这个垃圾桶文件中
    int fd = open(nullfile.c_str(), O_RDWR);
    if (fd > 0)
    {
        // 重定向
        dup2(fd, 0); 
        dup2(fd, 1);
        dup2(fd, 2);
        close(fd);
    }
}

原文地址:https://blog.csdn.net/m0_70088010/article/details/140626832

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!