会话守护进程

会话&&守护进程

文章目录

  • 会话&&守护进程
    • 1.会话
      • 1.概念和特性
      • 2.创建会话
      • 3.getsid和setsid函数
        • getsid函数
        • setsid 函数
      • 4.代码
    • 2.守护进程
    • 3.创建守护进程模型
      • 守护进程创建步骤:
        • 两个函数
      • 完整代码:

1.会话

1.概念和特性

进程组,也称之为作业。BSD 于 1980 年前后向 Unix 中增加的一个新特性。代表一个或多个进程的集合。每个

进程都属于一个进程组。在 waitpid 函数和 kill 函数的参数中都曾使用到。操作系统设计的进程组的概念,是为了

简化对多个进程的管理。

当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组 ID==第一个进程 ID(组长进程)。

所以,组长进程标识:其进程组 ID==其进程 ID

可以使用

kill -SIGKILL -进程组 ID(负的)

来将整个进程组内的进程全部杀死。

组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。只要进程组中有一个进程存在,进程组就

存在,与组长进程是否终止无关。

进程组生存期:进程组创建到最后一个进程离开(终止或转移到另一个进程组)。

一个进程可以为自己或子进程设置进程组 ID

会话(Session)和进程组(Process Group)

  • 进程组:

    • 进程组是一个或多个进程的集合。进程组中的进程可以通过组 ID 来标识,这个组 ID 是一个正整数。当一个进程被创建时,它会被加入到父进程所在的进程组中。进程组主要用于对一组进程进行信号的批量操作,例如,当向一个进程组发送一个信号(如SIGINT信号)时,该进程组中的所有进程都会收到这个信号。
  • 会话:

    • 会话是一个或多个进程组的集合。一个会话通常有一个会话首进程(Session Leader),会话首进程是创建会话的进程。会话有自己的会话 ID,它也是一个正整数。一个会话可以包含多个进程组,这些进程组之间相互独立,但是在会话的层次结构下又有一定的关联。例如,在一个终端登录会话中,用户启动的所有进程(包括前台进程组和后台进程组)都属于同一个会话。
  • 包含关系:

    • 进程组是会话的组成部分。一个会话包含一个或多个进程组,会话为这些进程组提供了一个更高层次的组织框架。例如,在一个用户登录的会话中,用户可能会启动多个命令,每个命令可能包含一个或多个进程,这些进程构成不同的进程组,而所有这些进程组都属于这个用户登录的会话。

2.创建会话

创建一个会话需要注意以下 6 点注意事项:

1.调用进程不能是进程组组长,该进程变成新会话首进程(session header)

2.该进程成为一个新进程组的组长进程。

3.需有 root 权限 (ubuntu 不需要)

4.新会话丢弃原有的控制终端,该会话没有控制终端(没有终端就无法与用户完成交互)

5.该调用进程是组长进程,则出错返回

6.建立新会话时,先调用 fork, 父进程终止,子进程调用 setsid()

3.getsid和setsid函数

getsid函数

获取进程所属的会话 ID

pid_t getsid(pid_t pid); 

成功:返回调用进程的会话 ID;失败:-1,设置 errno

pid 为 0 表示察看当前进程 session ID

ps ajx 命令查看系统中的进程。参数 a 表示不仅列当前用户的进程,也列出所有其他用户的进程,参数 x 表示

不仅列有控制终端的进程,也列出所有无控制终端的进程,参数 j 表示列出与作业控制相关的信息。

组长进程不能成为新会话首进程,新会话首进程必定会成为组长进程。

setsid 函数

创建一个会话,并以自己的 ID 设置进程组 ID,同时也是新会话的 ID。

pid_t setsid(void); 

成功:返回调用进程的会话 ID;失败:-1,设置 errno

调用了 setsid 函数的进程,既是新的会长,也是新的组长。

进程id,组id,会话id三者都相同

4.代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(void)
{pid_t pid;if ((pid = fork()) < 0) {perror("fork");exit(1);} else if (pid == 0) {//进程idprintf("child process PID is %d\n", getpid());//进程组idprintf("Group ID of child is %d\n", getpgid(0));//会话idprintf("Session ID of child is %d\n", getsid(0));sleep(10);setsid();       //子进程非组长进程,故其成为新会话首进程,且成为组长进程。该进程组id即为会话进程printf("Changed:\n");printf("child process PID is %d\n", getpid());printf("Group ID of child is %d\n", getpgid(0));printf("Session ID of child is %d\n", getsid(0));sleep(20);exit(0);}return 0;
}

image-20241220220802471

2.守护进程

Daemon(精灵)进程,是 Linux 中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以 d 结尾的名字。

Linux 后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现;ftp 服务器;nfs 服务器等。

创建守护进程,最关键的一步是调用 setsid 函数创建一个新的 Session,并成为 Session Leader。

重点:

daemon进程。通常运行与操作系统后台,脱离控制终端。一般不与用户直接交互。周期性的等待某个事件发生或周期性执行某一动作。

不受用户登录注销影响。通常采用以d结尾的命名方式。

3.创建守护进程模型

守护进程创建步骤:

1.创建子进程,父进程退出

所有工作在子进程中进行形式上脱离了控制终端

2.在子进程中创建新会话

setsid()函数

使子进程完全独立出来,脱离控制

3.改变当前目录位置

chdir()函数 传入自己想要改到的目录位置就行

防止占用可卸载的文件系统

一般设置为根目录,也可以换成其它路径

4.重设文件权限掩码

umask()函数

防止继承的文件创建屏蔽字拒绝某些权限

增加守护进程灵活性

5.关闭/重定向文件描述符

继承的打开文件不会用到(因为守护进程不与用户交互),浪费系统资源,无法卸载

还有另外一种做法是将文件描述符0,1,2重定向到/dev/null,不让标准输入输出异常影响守护进程而且系统返回的新的文件描述符还是从3开始的,符合编程习惯

6.开始执行守护进程核心工作守护进程退出处理程序模型

两个函数

chdir函数

  • 函数原型int chdir(const char *path);
  • 功能chdir函数用于改变当前工作目录。它接受一个字符串参数path,这个参数指定了新的工作目录的路径。工作目录是进程在文件系统中进行文件操作(如打开、读取、写入文件等)时的默认目录位置。

参数:

  • const char *path:这是一个指向以空字符结尾的字符串的指针,该字符串包含了新工作目录的绝对路径或相对路径。例如,"/home/user/documents"是绝对路径,"../new_folder"是相对路径(相对于当前工作目录)。

返回值:

  • 成功时,函数返回0
  • 失败时,返回-1,并且会设置errno来指示错误原因。常见的错误原因包括:
    • EACCES:没有权限访问指定的目录。
    • ENOENT:指定的目录不存在。
    • ENOTDIR:路径中的某个部分不是一个目录。

umask函数

  • 函数原型mode_t umask(mode_t mask);
  • 功能umask函数用于设置进程的文件模式创建掩码(file mode creation mask)。文件模式创建掩码决定了新创建文件或目录的默认权限。当进程创建一个新文件或目录时,实际的权限是由open(或creat等用于创建文件的函数)等函数中指定的权限与umask函数设置的掩码进行按位与运算后的结果。
  • 参数:
    • mode_t mask:这是一个位掩码,用于指定要屏蔽的权限位。它通常是一个八进制数,用于表示用户(文件所有者)、组(与文件所有者同组的用户)和其他用户(既不是所有者也不是同组用户)的读(r)、写(w)和执行(x)权限。例如,0022表示屏蔽组用户和其他用户的写权限。
  • 返回值:
    • 函数返回旧的文件模式创建掩码。这可以用于在需要恢复之前的掩码设置时使用。

完整代码:

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>void sys_err(const char *str)
{perror(str);exit(1);
}int main(int argc, char *argv[])
{pid_t pid;int ret, fd;pid = fork();if (pid > 0)                // 父进程终止exit(0);pid = setsid();           //创建新会话if (pid == -1)sys_err("setsid error");ret = chdir("/home");       // 改变工作目录位置if (ret == -1)sys_err("chdir error");umask(0022);            // 改变文件访问权限掩码close(STDIN_FILENO);    // 关闭文件描述符 0fd = open("/dev/null", O_RDWR);  //  fd --> 0if (fd == -1)sys_err("open error");dup2(fd, STDOUT_FILENO); // 重定向 stdout和stderrdup2(fd, STDERR_FILENO);while (1);              // 模拟 守护进程业务.return 0;
}

运行:

./mydeamon
ps aux

image-20241220213958304

可以看到它没有控制终端而是跑到后台运行去了

这个不受用户登录注销影响,即使我注销了换个账号登录也还会有这个的

可以使用kill命令杀死进程

kill -9 进程号

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

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

相关文章

学习反射(反射的使用,反射的应用场景)

目录 反射的使用 总的测试代码如下 反射的应用场景 反射的使用 大家先看一个案例 有一个person 类 属性有 String 类型的 name ,int age &#xff0c;还有一个 方法 a。 package fs;public class Person {private String name;private int age;public void a(){System.out.p…

在ESP32使用AT指令集与服务器进行TCP/IP通信时,<link ID> 解释

在ESP32使用AT指令集与服务器进行TCP/IP通信时&#xff0c;<link ID> 是一个非常重要的参数。它用于标识不同的连接实例&#xff0c;特别是在多连接场景下&#xff08;如同时建立多个TCP或UDP连接&#xff09;。每个连接都有唯一的<link ID>&#xff0c;通过这个ID…

Ansible 批量管理华为 CE 交换机

注&#xff1a;本文为 “Ansible 管理华为 CE 交换机” 相关文章合辑。 使用 CloudEngine - Ansible 批量管理华为 CE 交换机 wsf535 IP 属地&#xff1a;贵州 2018.02.05 15:26:05 总体介绍 Ansible 是一个开源的自动化运维工具&#xff0c;AnsibleWorks 成立于 2012 年&a…

【python虚拟环境安装】linux centos 下的python虚拟环境配置

linux centos 下的python虚拟环境配置 在 CentOS 环境中处理 pip 安装警告的方法1. 创建并使用虚拟环境2. 忽略警告并继续使用 root 用户安装&#xff08;不推荐&#xff09;报错问题处理 在 CentOS 环境中处理 pip 安装警告的方法 当在 CentOS 环境中遇到 pip 安装警告时&…

【Datawhale AI 冬令营】如何动手微调出自己的大模型

目录 总体思路实操案例数据集构造收集数据数据构造 模型微调选择模型选择数据集参数配置开始训练 模型使用 总体思路 微调大模型主要以开源的通用大模型为基础&#xff0c;喂给模型自己准备的数据&#xff0c;将通用的大模型往自己想要的方向引导&#xff0c;变成更偏向某一领…

Python编程常用的19个经典案例

Python 的简洁和强大使其成为许多开发者的首选语言。本文将介绍36个常用的Python经典代码案例。这些示例覆盖了基础语法、常见任务、以及一些高级功能。 1. 列表推导式 fizz_buzz_list ["FizzBuzz" if i % 15 0 else "Fizz" if i % 3 0 else "Buzz…

关于数据流图绘制和使用上的一些个人经验

假设我们需要开发一个项目进度管理系统&#xff0c;在这个项目进度管理系统之中&#xff0c;我们需要开发一个功能&#xff1a;项目成员的列表。我们具有这样的业务需求&#xff1a; 在项目进度管理系统中&#xff0c;我们需要知道参与项目的人员到底有哪些&#xff0c;并且项目…

手眼标定工具操作文档

1.手眼标定原理介绍 术语介绍 手眼标定&#xff1a;为了获取相机与机器人坐标系之间得位姿转换关系&#xff0c;需要对相机和机器人坐标系进行标定&#xff0c;该标定过程成为手眼标定&#xff0c;用于存储这一组转换关系的文件称为手眼标定文件。 ETH&#xff1a;即Eye To …

AlipayHK支付宝HK接入-商户收款(PHP)

一打开支付宝国际版 二、点开商户服务 三、下载源码

基于Arduino的平衡车机械臂

两轮驱动机器人车与机械臂的DIY指南 视频&#xff1a; 基于Arduino的平衡车机械臂 资料下载链接 引言 在这篇文章中&#xff0c;我们将一起探索如何构建一个两轮驱动的机器人车&#xff0c;并配备有一个机器人臂&#xff0c;这个项目适合初学者&#xff0c;并且可以在动态环…

【练习Day20】字符串变形

链接&#xff1a;字符串变形_牛客题霸_牛客网 方法一&#xff1a;双逆转&#xff08;推荐使用&#xff09; 思路&#xff1a; 将单词位置的反转&#xff0c;那肯定前后都是逆序&#xff0c;不如我们先将整个字符串反转&#xff0c;这样是不是单词的位置也就随之反转了。但是单…

ip地址和网络号关系是什么

在浩瀚的网络世界中&#xff0c;每一个连接互联网的设备都需要一个独特的标识来确保数据的准确传输。这个标识就是IP地址。然而&#xff0c;在深入探索IP地址的同时&#xff0c;我们不得不提及一个与之紧密相关的概念——网络号。网络号与IP地址之间存在着怎样的联系与区别&…

android 登录界面编写

1、登录页面实现内容 1.实现使用两个EditText输入框输入用户名和密码。 2.使用CheckBox控件记住密码功能。 3.登录时候&#xff0c;验证用户名和密码是否为空。 4.当前CheckBox控件记住密码勾上时&#xff0c;使用SharedPreferences存储用户名和密码。 5.登录时候使用Prog…

run postinstall error, please remove node_modules before retry!

下载 node_modules 报错&#xff1a;run postinstall error, please remove node_modules before retry! 原因&#xff1a;node 版本出现错误&#xff0c;我的项目之前是在 12 下运行的。解决方法&#xff1a; 先卸载node_modules清除缓存将node版本切换到12重新下载即可

Docker 安装 禅道-21.2版本-外部数据库模式

Docker 安装系列 1、拉取最新版本&#xff08;zentao 21.2&#xff09; [rootTseng ~]# docker pull hub.zentao.net/app/zentao Using default tag: latest latest: Pulling from app/zentao 55ab1b300d4b: Pull complete 6b5749e5ef1d: Pull complete bdccb03403c1: Pul…

visual studio 2022 c++使用教程

介绍 c开发windows一般都是visual studio&#xff0c;linux一般是vscode&#xff0c;但vscode调试c不方便&#xff0c;所以很多情况都是2套代码&#xff0c;在windows上用vs开发方便&#xff0c;在转到linux。 安装 1、官网下载vs2022企业版–选择桌面开发–安装位置–安装–…

python学opencv|读取图像(十七)认识alpha通道

【1】引言 前序学习进程中&#xff0c;我们已经掌握了RGB和HSV图像的通道拆分和合并&#xff0c;获得了很多意想不到的效果&#xff0c;相关链接包括且不限于&#xff1a; python学opencv|读取图像&#xff08;十二&#xff09;BGR图像转HSV图像-CSDN博客 python学opencv|读…

设计模式--单例模式【创建型模式】

设计模式的分类 我们都知道有 23 种设计模式&#xff0c;这 23 种设计模式可分为如下三类&#xff1a; 创建型模式&#xff08;5 种&#xff09;&#xff1a;单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式&#xff08;7 种&#xff09;&#xff1…

neo4j 图表数据导入到 TuGraph

neo4j 图表数据导入到 TuGraph 代码文件说明后文 前言:近期在引入阿里的 TuGraph 图数据库&#xff0c;需要将 原 neo4j 数据导入到新的 tugraph 数据库中。预期走csv文件导入导出&#xff0c;但因为格式和数据库设计问题&#xff0c;操作起来比较麻烦&#xff08;可能是个人没…

模具生产过程中的标签使用流程图

①NFC芯片嵌入周转筐&#xff0c;通过读卡器读取CK_Label_v3的数据&#xff0c;并将这些信息上传至服务器进行存储&#xff1b; ②服务器随后与客户的WMS&#xff08;仓库管理系统&#xff09;进行交互&#xff0c;记录和同步注塑机的原始数据&#xff1b; ③当周转筐内的模具…