Linux---守护进程

运行的这个进程,它的pid和gpid(进程组ID)一样,它是自成一组的。

这就是一个进程组。

进程组和任务有什么关系?

将任务指派给进程组。任务都是由进程组去完成的。

可以发现,这三个进程的会话id1351都是一样的,多个任务(进程组),在同一个sesion内启动的sid是一样的。


当后台任务在执行的时候,我将用户退出,后台任务就会受到退出的影响。

如果不想受到用户登录和注销的影响---守护进程话

当前用户在登录的时候,让其中的某个进程组自成一个会话,这个会话不需要和键盘显示器什么的关联。这种自称进程组会话的进程,叫守护进程。

此时再把用户退出,这个进程不会受到任何影响。


setsid 是一个Linux系统调用,用于创建一个新的会话(session)。
这个新的会话通常是用于创建守护进程(daemon)的。
#include <unistd.h>pid_t setsid(void);
(进程组的组长不能独立成一个会话)

第1步:fork子进程,父进程退出子进程继承了父进程的进程组id,但具有一个新的进程id,这样就保证了子进程不是一个进程组的组长id,这对于下面要做的setsid函数的调用是必要的前提条件

第2步:子进程调用 setsid函数创建新会话调用这个函数以后该进程成为新会话的首进程,是会话的会长成为一个新进程组的组长进程,是进程组组长不受控制终端的影响

第3步:改变当前工作目录chdir如:a.0ut在u盘上,启动这个程序,这个程序的当前的工作目录就是这个u盘,如果u盘拔掉后进程的当前工作目录将消失,a.out将不能正常工作。

第4步:重设文件掩码 mode & umask子进程会继承父进程的抢码 中,增加子进程程序操作的灵活性umask(0000);

第5步:关闭文件描述符守护进程术受控制终端的影响所以可以关闭,以释放资源

close(stdin_fileno);

close(stdout_fileno);

close(stderr_fileno);

第6步:执行核心工作守护进程的核心代码逻辑

345部不是必须的

守护进程一般以d结尾命名

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <fcntl.h>void myfunc(int signo)
{int fd = open("./session.txt", O_RDWR | O_CREAT | O_APPEND, 0755);if (fd < 0){return;}// 打开文件成功后获取当前时间time_t t;time(&t);char *p = ctime(&t);write(fd, p, strlen(p));close(fd);return;
}int main()
{// 1.创建子进程pid_t id = fork();if (id != 0)exit(0);// 2.子进程调用setsid函数创建会话setsid();// 3.改变工作目录(可选)// chdir();// 4.文件掩码(可选)// umask(0000);// 5.关闭标准输入,标准输出,标准错误文件描述符// close(STDIN_FILENO);// close(STDOUT_FILENO);// close(STDERR_FILENO);// 也可以将这三个文件重定向到黑洞文件 /dev/null 中。这个文件通常用于丢弃数据int fd = open("/dev/null", O_CREAT | O_RDWR | O_APPEND, 0775);if (fd < 0){exit(-1);}dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);struct sigaction act;act.sa_flags = 0;act.sa_handler = myfunc;sigemptyset(&act.sa_mask);sigaction(SIGALRM, &act, nullptr);struct itimerval tm;tm.it_interval.tv_sec = 2;tm.it_interval.tv_usec = 0;tm.it_value.tv_sec = 3;tm.it_value.tv_usec = 0;setitimer(ITIMER_REAL, &tm, NULL);while (1){sleep(1);}return 0;
}

程序运行之后,直接去后台了。PPID为1,PID PGID SID都一样,自成进程组,自成会话。

下面我将云服务器关了。一会登录查看日志文件。

用户的退出或者登录该任务没有任何影响。


Linux提供了守护进程的系统调用接口

daemon 函数用于将当前进程转变为守护进程(daemon)。
#include <unistd.h>
int daemon(int nochdir, int noclose);
nochdir:如果 nochdir 不为0,表示不改变当前工作目录为根目录(/);如果为0,则会将当前工作目录更改为根目录。
noclose:如果 noclose 不为0,表示不关闭标准输入、标准输出和标准错误文件描述符;如果为0,则会关闭这些文件描述符。
daemon 函数的返回值为0表示成功,-1表示失败。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/467716.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】MySQL数据库学习笔记(二)——数据类型(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 文章目录 【MySQL数据库学习】系列文章一、整…

Gopro Fusion Studio在win10上无法导入Fusion的视频文件

在win10家庭版已经尝试1.0&#xff0c;1.3&#xff0c;1.4三个版本&#xff0c;都是无法渲染&#xff0c;我安装了Gopro VR Player的。 在虚拟机中重新装了win10 企业版&#xff0c;安装了1.4的Gopro Fusion Studio也不行&#xff0c;都是报这个错&#xff0c;目前没啥解决办法…

MyBatis中的XML实现和动态SQL实现

文章目录 一、XML实现1.1增1.2删1.3查1.4改 二、XML方式实现动态SQL2.1if标签2.2trim标签2.3where标签2.4set标签2.5foreach标签2.6include标签和sql标签 一、XML实现 先在新建的XML文件中写入如下内容&#xff1a; <?xml version"1.0" encoding"UTF-8&qu…

腾讯云4核8G服务器多少钱?646元一年零3个月

腾讯云服务器4核8G配置优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;腾讯云百科txybk.com分…

力扣精选算法100道——矩阵区域和 (前缀和专题)

目录 &#x1f388;了解题意 &#x1f388;算法原理 &#x1f388;实现代码 &#x1f388;了解题意 给定一个大小为 m x n 的矩阵 mat 和一个整数 k&#xff0c;你需要计算一个新的矩阵 answer&#xff0c;其中每个 answer[i][j] 表示矩阵 mat 中以坐标 (i, j) 为中心、边…

162基于matlab的多尺度和谱峭度算法对振动信号进行降噪处理

基于matlab的多尺度和谱峭度算法对振动信号进行降噪处理&#xff0c;选择信号峭度最大的频段进行滤波&#xff0c;输出多尺度谱峭度及降噪结果。程序已调通&#xff0c;可直接运行。 162 matlab 信号处理 多尺度谱峭度 (xiaohongshu.com)

Solidworks:挑战新问题,不知道如何画出斜视图?

如果图形都是基于XYZ三个方向构造&#xff0c;没什么难度。如果有其他倾斜方向的&#xff0c;问题就难了。今天试了一下&#xff0c;看看我的3D模型。 出图纸的时候&#xff0c;不知道如何才能投影出斜视图&#xff0c;一边准确描述下面的那个小局部孔位。 补充&#xff1a;查了…

PID控制器轨迹跟随 实现

参考博客&#xff1a; 【自动驾驶】PID实现轨迹跟踪 | python实现 | C实现 【C matplotlib 画图 Linux】 【无人车系统&#xff08;一&#xff09;&#xff1a;运动学模型及其线性化】 1 运动学模型及其线性化 无人车运动学模型&#xff1a; v v v&#xff1a;无人车的速度 …

蓝牙BLE学习-安全

1.基本概念 蓝牙标准规定了5种基本的安全服务 身份验证:根据通信设备的蓝牙地址验证其身份。蓝牙不提供本地用户身份验证。保密性:确保只有授权的设备才能访问和查看传输的数据&#xff0c;防止窃听造成的信息泄露。授权(Authorization):在允许设备使用某项服务之前&#xff…

第三篇【传奇开心果微博系列】Python微项目技术点案例示例:爱的表达

传奇开心果微博系列 系列微博目录Python微项目技术点案例示例系列 微博目录一、微项目目标二、雏形示例代码三、扩展思路四、添加加载图片和小视频功能示例代码五、添加音效和背景音乐六、添加用户交互示例代码七、添加定时提醒功能示例代码八、自定义界面示例代码九、多语言支…

MySQL表的增删查改(基础)

新增&#xff08;Create) 1.全列插入 全列单行插入 insert into 表名 values(值&#xff0c;值……)&#xff1b; 也可以全列且多行插入 insert into 表名 values (值&#xff0c;值……)&#xff0c;(值&#xff0c;值……)……&#xff1b; 2.指定列插入 insert into 表…

五.实战软件部署 1-3实战章节-前言MYSQL 5.7版本在centos系统安装MYSQL 8.0版本在centos系统安装

目录 五.实战软件部署 1-实战章节-前言 五.实战软件部署 2-MYSQL 5.7版本在centos系统安装 1-配置yum仓库 2-使用yum安装mysql 3-安装完成后&#xff0c;启动mysql并配置开机自启动 4-检查mysql的运行状态 --配置 1-获取mysql的初识密码 2-登录mysql数据库系统 3-修改…