linux 进程组和会话和线程

Linux下的系统编程——守护进程、线程(十二) 我们知道进程拥有一个PCB,在Linux中被称为task_struct,并且有一个进程地址空间,也有一个页表,通过页表指向物理内存,但是从今天开始,对进程的概念可能发生变化,这个我们后边来说,在Linux中,并没有真正的线程,而是使用进程的PCB来模拟线程,也就是说一个线程在创建时,只会去创建一个PCB,而这个PCB也指向主线程的虚拟地址空间,和其他线程一起共享内存的代码和数据。一个线程也被称为一个执行流,这是因为线程是被CPU调度的执行流,而一个进程就是分配系统资源的基本实体。下面让我们进入线程的学习吧。 阅读详情

进程组和会话和线程

创建会话

6点注意事项

  • 调用进程不能是进程组的组长, 该进程会变成新会话的首进程
  • 该进程成为一个新进程的组长进程
  • 需要有root权限
  • 新会话丢弃原有的控制终端, 该会话无控制终端, 即无法与用户交互
  • 若调用进程是组长进程, 则会出错返回
  • 建立新会话时, 先调用fork, 父进程终止, 子进程调用setsid
getsid函数
作用: 查看当前进程在的会话的id
pid_t getsid(pid_t pid);
参数:
	pid: 要查看的进程的pid
		0 : 本组的会话id
返回值:
	成功: 当前的会话id
	失败: -1, 设置errno
setsid函数
作用: 当当前进程不是组的组长时, 则创建一个新的会话, 然后使其成为会话组长和组组长
pid_t setsid(void);
返回值:
	成功: 返回调用的进程的会话ID
	失败: -1, 设置errno

守护进程

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

守护进程的特点:

  • 没有控制终端
  • 不能和用户直接交互
  • 不受用户的登陆,注销的影响
  • 始终运行
创建守护进程模型
  1. 创建子进程, 父进程退出

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

    setsid()

  3. 改变当前目录位置

    chdir()

  4. 重设文件权限掩码

    umask()

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

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

    因为继承打开的文件不会用到, 浪费系统资源, 无法卸载

    重定向: 将之前的文件重定向到/dev/null

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

    while()

chdir函数
作用: 改变当前工作目录的位置, 防止占用可卸载文件系统
int chdir(const char *path);
参数:
	path: 目标目录的路径
返回值:
	成功: 0
	失败: -1, 设置errno
umask函数
作用: 
mode_t umask(mode_t mask);
参数:
	mask: 8进制的值

返回值:
	成功: 之前设置的值

线程的概念

线程是轻量级进程

进程和线程的区别:

  • 进程有独立的地址空间,有独立的pcb
  • 线程无独立的地址空间,有独立的pcb

在linux中, 线程是最小的执行单元, 进程是最小的资源分配单元

查看pid程序的线程

ps -Lf <pid>
liux内核实现原理
  • 创建线程使用的底层函数与进程一样clone
  • 从内核看, 进程和线程一样, 都有自己的不同的pcb, 但是pcb中指向内存资源的三级页表是相同的
  • 进程可以蜕变成线程
  • 线程是最小的执行单元, 进程是最小的资源分配单元
线程共享的资源
  1. 文件描述符

  2. 每种信号的处理方式

    信号处理方式: 哪个线程抢到了,哪个线程就处理他

  3. 当前工作目录

  4. 用户id和组id

  5. 内存地址空间

    (.text/ .data/ .bss/ 共享库)

线程非共享资源
  1. 线程id

  2. 处理器现场和栈指针(内核栈)

  3. 独立的栈空间(用户栈空间)

  4. errno变量(全局变量)

  5. 信号屏蔽字

    可以指定某一个线程来处理一个特定的信号

  6. 调度优先级

线程的优点/缺点

优点:

  1. 提高程序的并发性
  2. 开销小
  3. 数据通信,共享数据方便

缺点:

  1. 库函数, 不稳定
  2. 调试, 编写困难
  3. 对信号支持不好

线程控制原语

检查出错返回值

不能使用perror()!!

fprintf(stderr, "xxx error: %s\n", strerror(ret));
pthread_self函数
作用:获取线程id
pthread_t pthread_self(void);
返回值:
	当前线程的id
pthread_create函数
作用:创建一个新进程
int pthread_create(pthread_t *restrict thread,
                   const pthread_attr_t *restrict attr,
                   void *(*start_routine)(void *),
                   void *restrict arg);
参数:
	thread: 传出参数, 新创建线程的线程id
	attr: 线程属性, 默认为NULL
	start_routine: 子线程回调函数, 创建成功, pthread_create函数返回时,该函数会被自动调用
	arg: start_routine的参数, 若没有,则为NULL
    
返回值:
	成功: 0
	失败: 错误号, 且thread为定义
pthread_exit函数
作用: 退出当前的线程(包括主线程)
noreturn void pthread_exit(void *retval);
参数:
	retval: 推出值, 无推出值时, NULL
返回值:
	无

比较:

  • exit()退出当前进程
  • return返回到调用者
  • pthread_exit()推出当前线程
pthread_join函数
作用:阻塞地回收指定的线程, 并且可以获取等待线程的返回值
int pthread_join(pthread_t thread, void **retval);
参数:
	thread:传入参数, 待回收的线程id
	reval: 传出参数, 为待回收的线程的退出值
			若线程异常结束, 值为-1
返回值:
	成功: 0
	失败: 错误号
pthread_cancel函数
作用:杀死线程, 需要一个取消点(保存点)
int pthread_cancel(pthread_t thread);
参数:
	thread: 待杀死的线程id
	返回值:
		成功: 0
		失败: 错误号

注意:

  • 如果子线程没有到达取消点, 则pthread_cancel无效,此时可以手动添加取消点 pthread_testcancel()
  • 成功被pthread_cancel()杀死的线程, 返回-1, 使用pthread_join来回收该值
pthread_detach函数
作用: 将指定的线程分离
int pthread_detach(pthread_t thread);
参数:
	thread: 待分离的线程id
返回值:
	成功: 0
	失败: 错误号

分离了以后,当线程终止的时候,线程会自己回收自己的pcb, 无需主线程用join来回收


线程控制原语进程控制原语
pthread_createfork
pthread_selfgetpid
pthread_exitexit
pthread_joinwait/waitpid
pthread_cancelkill
pthread_detach

线程属性

typedef struct
{
       int 					__detachstate;		// 线程的分离状态
       int 					__schedpolicy;		// 线程的调度策略
       struct sched_param 	__schedparam;		// 线程的调度参数
       int 					__inheritsched;		// 线程的继承性
       int 					__scope;			// 线程的作用域
       size_t 				__guardsize;		// 线程的缓冲区大小
       int 					__stackaddr_set;	// 线程的栈设置
       void* 				__stackaddr;		// 线程的栈位置
       size_t 				__stacksize;		// 线程的栈大小
} pthread_attr_t;
线程属性初始化

注意: 应该先初始化线程属性, 再pthread_create创建线程

作用:初始化线程属性
int pthread_attr_init(pthread_attr_t *attr);
参数:
	attr: 传出参数, 初始化以后的属性
返回值:
	成功: 0
	失败: 错误号


作用: 销毁线程属性所占用的资源
int pthread_attr_destroy(pthread_attr_t *attr);
参数:
	attr: 待销毁的线程属性
返回值:
	成功: 0
	失败: 错误号
设置线程分离
作用:设置当前线程分离的属性
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
参数:
	attr: 传出参数, 待修改的属性值
	detachstate: 线程分离的属性值
		PTHREAD_CREATE_DETACHED(分离的)
		PTHREAD_CREATE_JOINABLE(未分离的,默认的)
返回值:
	成功: 0
	失败: 错误号
	
作用: 获取当前线程分离的属性
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
参数:
	attr: 已初始化的线程属性
	detachstate: 传出参数, 当前线程的状态
返回值:	
	成功: 0
	失败: 错误号
实例
通过线程属性将一个线程设置为分离态
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&tid, &attr, tfn, NULL);
pthread_attr_destroy(&attr);

线程使用注意事项

  • 主线程退出, 其他线程推出, 则用pthread_exit
  • 避免僵尸线程
    • pthread_join
    • pthread_detach
    • pthread_create, 指定分离属性
  • malloc和mmap申请的内存可被其他的线程释放
  • 避免在多线程中调用fork, 除非马上exec .子进程中只有fork线程存在, 其他的进程均要pthread_exit(即,只存活了调用fork的进程)
  • 信号和多线程不要同时用
Linux内核进程管理子系统有什么第三十五回 —— 进程主结构详解(31) 阅读详情

相关推荐

Linux:进程与线程(详)

一张图理解线程: 主线程和子线程 共享: .text .bss .data 堆 动态加载区 环境变量 命令行参数 通信时,可使用全局变量或堆数据 不共享: 栈区是每个线程独有的 在Linux下,线程就是进程,属于轻量级进程。对于内核来说,线程就是进程。 多进程和多线程的区别: 多进程: -------始终共享的资源: 代码 文件描述符 内存映射区 mmap -------线程共享: 堆 ...

不秃头的程序猿Gabriel的博客 295

【Linux系统编程】28.创建会话、getsid、setsid、守护进程

【Linux系统编程】28.创建会话、getsid、setsid、守护进程。

因心,三人水的博客 604

Sentence-BERT 语义相似度双塔模型

论文介绍 发表:2019,EMNLP 论文题目:《Sentence-BERT:sentence embeddings using siaese BERT-networks》 论文地址:https://arxiv.org/abs/1908.10084 Github:https://github.com/UKPLab/sentence-transformers 适用领域: 句向量生成 语义相似度计算 语义搜索 无监督任务(聚类) 1 概述 在20年之前的各种预训练模型中,比如bert,XLNet,Alb

weiyaner的博客 9194

Linux系统编程 ---- 终端、进程组、会话

Linux 终端、进程组、会话 终端(Computer terminal),是与计算机系统相连的一种输入输出设备,通常离计算机较远。在UNIX系统中,用户通过终端登录系统后创建一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal)。进程中,控制终端是保存在PCB中的信息,而fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。 目录Linux 终端、进程组、会话前言终端相关函数进程组会话创建会话的注意事项会话相关函数g

juggte的博客 1757

实战解析:如何用Python逆向破解FastMoss的TikTok数据加密签名(附完整代码)

本文详细解析了如何用Python逆向破解FastMoss平台的TikTok数据加密签名机制,包括MD5加密算法和JS逆向分析。通过完整的Python代码示例,帮助开发者理解签名生成原理并实现自动化请求,提升数据获取能力。

weixin_30955617的博客 560

大厂案例:快手AI人才管理系统的架构设计与效果

凌晨两点刷简历的HR、说不清“团队离职率高”原因的业务leader、不知道“该学什么”的员工——这些人力资源场景中的“痛点”,曾是快手高速增长期的真实写照。当员工规模从几千扩张到几万,传统HR系统的“经验驱动”模式彻底失效。2021年,快手启动AI人才管理系统建设,用“数据+算法”重构招聘、培养、绩效、留存全流程。本文将拆解这套系统的架构设计逻辑核心技术实现,以及真实业务效果AI如何让HR从“事务执行者”变成“战略伙伴”?

大模型应用工坊 1712

Linux程序设计-5.守护进程

5

qq_46591037的博客 547

AUTOSAR网络管理配置详解:Vector DaVinci工具全面讲解

手把手带你用Vector DaVinci完成AUTOSAR网络管理模块的配置,涵盖NmChannel、NmPdu、重复帧抑制等关键参数设置,深入解析CAN总线上的NM报文调度与唤醒机制,助你扎实掌握AUTOSAR网络管理核心实践。

weixin_42504649的博客 168

事务、会话与线程的关系和区别

事务:简单理解局势一个业务需求的最小处理单位。 如:从A银行卡转账500元到B银行卡,事务就包括两部分,1、从A卡减掉500元 2、从B卡加上500元     这两个部分只要一个部分出错,就要整体“回滚”,那这就是一个事务 会话:可以包含N个事务 如:你登陆网银之后,可以重复转账步骤2次,第二次转账失败,并不影响你第一次转账成功。 线程:一个事情,一个人干和多个人干的问题

点十八的一方天地 3363

数字图像处理 基于OpenCV的景深融合算法

还有的思路是对图像序列中的每一张图像分别进行拉普拉斯金字塔拆分,提取出每一张图像的高频信息和低频信息,得到所述图像序列对应的高频信息集合和低频信息集合。然后根据所述高频信息集合得到合成后的高频信息,对所述低频信息集合进行导向滤波处理得到合成后的低频信息,根据所述合成后的高频信息和低频信息做拉普拉斯金字塔重构,得到一张超景深图像。这里声明了几个变量,ImMer是最终合成的图像,coll是中间处理的变量,Coll_Ori是保存原图像数据的变量,dstWidth目标图像宽度(一般都是与原始图像大小一致)。

学以致用 知行合一 3902

使用W5500与外网通信故障解决(MAC地址问题)

在蒲城项目的调试时,AMS500发现一个致命的问题,就是:在局域网跨网段通信时候和中心服务器不能通信,但是在一个HUB下是没有问题的,以前的串口服务器有过类似的问题出现,解决方法说是芯片的问题,结果也不了了之,换了芯片正常。 我们的网络通信芯片选择W5500,其中的MAC地址采用的是CPU的序列号作为Mac地址的问题就出在这,我们在使用的时候MAC地址的第一个必须是偶数,我们忽视了。 现象描...

zxm8513优快云博客 7756

程序开发:事务、会话与线程的概念

持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。代表的是客户端与服务器的一次交互过程,这个过程可以是连续也可以是时断时续的。如:比如植树,任务是植树100棵,一个人(线程)干5天,那五个人(线程)干1天。

w_anyuan998的博客 860

FineBI学习总结

交叉表:一组作为行标题显示在表的左部,另一组作为列标题显示在表的顶部。连接到数据,如果数据不满足数据分析的需求,先进行自助数据集处理。数据集分类:DB表、SQL、Excel、自助数据集。分组表:将报表中的数据按相同项合并为一组显示。1、数据准备2、制作仪表板3、分享仪表板。左合并:保留左边全部数据,合并右边。右合并:保留右边全部数据,合并左边。上下拼接:上下拼接到一张表数据。3、如何实现拼表:多表拼一张。分组–业务包–数据集–字段。字段分类:数值、文本和日期。目录–仪表板–数据准备。维度:文本和日期类型。

Rsun2018的博客 1561

一文读懂Linux进程、进程组、会话、僵尸

作者简介 herongwei,北交硕士毕业,现就职于搜狗公司,后端开发工程师。从事 C++,Golang ,Linux 后端开发。追求技术,热爱编程与分享,希望能和大家多多交流学习~座右...

宋宝华 5240

YOLOv11改进 | Conv/卷积篇 | 轻量化多尺度异构卷积(MSHC)优化YOLOv11精度(全网独家首发)

本文介绍了Hype-YOLO提出的MANet结构,这是C3、C2f、C3k2的升级版,能显著增强特征提取能力。MANet整合了DSConv和C2f结构,通过多分支异构设计提升梯度流动和特征语义深度。文章详细解析了MSHC模块的原理,包括其多尺度并行建模、通道混洗等核心机制,并提供了完整的代码实现和训练教程。实验表明,Hype-YOLO的精度优于YOLOv11。该结构在保持轻量化的同时,通过异构分支设计实现了更丰富的特征表达,适用于目标检测等视觉任务。

Snu77的博客 954

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

进程组、会话、守护进程和线程的概念

进程组和会话的概念、创建一个会话的注意事项以及如何fork一个子进程,并使其创建一个新会话、getsid和setsid函数、创建守护进程模型(守护进程的概念)、线程的概念(Linux内核线程实现原理)、线程共享的资源有哪些..........

caiji0169的博客 1559

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux系统编程---守护进程、线程

守护进程的创建、线程共享及线程的相关函数实现

qq_51647149的博客 1744

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

linux系统编程-线程

下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。,将整个进程退出了,所以全部线程退出了。非分离状态:线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。

cat_fish_rain的博客 709

【Linux系统编程】守护进程、线程

【Linux系统编程】守护进程、线程(超详细)

qq_59084325的博客 1715

守护进程和线程

守护进程和线程 守护进程 Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字,如vsftpd Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现;ftp服务器;nfs服务器等 进程组和会话 ps ajx查看进程组ID和会话ID 进程组 进程组是一个或者多个进程的集合,每个进程都属于一个进程组,引入进程组是为了简化

blll0的博客 927

Linux-线程

i<MAX;i++)crt++;usleep(10);上面的线程使用了两把锁,但是最后只解开了一把,另一把还在锁着;

weixin_45910290的博客 2498

Linux线程学习

进程要创建会话才变成守护进程。

2202_75840803的博客 1060

Linux学习之系统编程6(线程)

本文纤细介绍了Linux系统编程中的重要概念——线程。我会从线程的创建,使用,回收,分离,终止去讲线程,同时配有图片,保证你一看就会。对于每一个过程,我都会写几个小demo来演示,提供源代码,帮助你更好的理解。还不赶紧点进来学习!!!!

yourgrandfather_的博客 1287

十四、Linux线程(一)

void *arg);const pthread_attr_t *attr, //线程属性,NULL。void *(*start_routine)(void *), //线程处理函数。主线程while循环,子线程在循环i = 2时,调用pthread_exit函数,退出单个子线程。函数原型: int pthread_cancel(pthread_t pthread);多进程:始终共享的资源:代码、文件描述符、内存映射区---mmap。在要杀死的子线程对应的处理的函数的内部,必须做过一次系统调用。

2402_87254779的博客 1155

十四、Linux之守护进程、线程

十四、Linux之守护进程、线程 目录:十四、Linux之守护进程、线程一、进程组和会话(session)1.进程组kill -SIGKILL -进程组ID2.创建会话3.setsid、getsid函数pid_t setsid(void);\ pid_t getsid(pid_t pid);二、守护进程(重要)1.基本概念2.创建守护进程的模型3.创建守护进程 一、进程组和会话(session) 1.进程组 当父进程创建子进程时,子进程会和父进程同属于一个进程组,且该组的组长为父进程,进程组ID为父进程

~宪宪的博客 385

Linux--守护进程和线程

 说出守护进程的特点  独立完成守护进程的创建  独立实现多个线程的创建  独立实现线程的退出和资源回收  理解线程同步的思想

m0_65993150的博客 522
上一篇: linux 信号相关的知识
下一篇: linux 线程同步
ghost_him
博客等级 码龄6年 598粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值