当前位置: 首页 > news >正文

进程组和用处

进程组:一个或多个进程的集合,进程组id是一个正整数。

组长进程:进程组id == 进程id

组长进程可以创建一个进程组,创建该进程组的进程,终止了,只要进程组有一个进程存在,进程组就存在,与组长进程是否终止无关。

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

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

作用

子进程退出时,不管父子进程同不同一个进程组,都会发SIGCHLD信号给父进程

当父子进程同进程组时,父进程应捕捉SIGCHLD信号,对子进程资源进程回收,防止僵尸进程的产生

当父子进程不同进程组时,比如设置子进程成为了一个新的进程组,这时候子进程退出,系统也会正常回收子进程的资源,不会产生僵尸进程的

相关函数

#include <unistd.h>

int setpgid(pid_t pid, pid_t pgid); //pid = 0, pgid = 0,让当前进程成为一个进程组,并且进程组id为当前进程的pid
pid_t getpgid(pid_t pid); //pid = 0,获取当前进程的进程组id

pid_t getpgrp(void); /* POSIX.1 version */
pid_t getpgrp(pid_t pid); /* BSD version */

int setpgrp(void); /* System V version */
int setpgrp(pid_t pid, pid_t pgid); /* BSD version */

demo

  1. 父子进程同一个进程组
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>void do_sigchld(int signo)
{pid_t pid;int status;printf("signo = %d\n", signo);while((pid = waitpid(0, &status, WNOHANG)) > 0) // 0:跟调用进程同组的子进程,WNOHANG:不阻塞,立即返回{if (WIFEXITED(status))printf("child %d exit status %d\n", pid, WEXITSTATUS(status));else if (WIFSIGNALED(status))printf("chid %d exit by signal %d\n", pid, WTERMSIG(status));} 
}int main(int argc, char *argv[])
{pid_t pid;//阻塞SIGCHLD信号sigset_t set;sigemptyset(&set);sigaddset(&set, SIGCHLD);sigprocmask(SIG_BLOCK, &set, NULL);pid = fork();if (pid == 0){//in child//解除阻塞SIGCHLD信号sigprocmask(SIG_UNBLOCK, &set, NULL);//进程组printf("child pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("child pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("child pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());/*setpgid(0, 0); //pid = 0, pgid = 0,让当前进程成为一个进程组,并且进程组id为当前进程的pidprintf("after setpgid(0, 0) child pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("after setpgid(0, 0) child pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("after setpgid(0, 0) child pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());*/}else if (pid > 0){//in parent//先捕捉SIGCHLD信号struct sigaction act;act.sa_handler = do_sigchld;sigemptyset(&act.sa_mask);act.sa_flags = 0; //0:用sa_handler参数,SA_SIGINFO:用sa_sigaction参数sigaction(SIGCHLD, &act, NULL);//再解除阻塞SIGCHLD信号sigprocmask(SIG_UNBLOCK, &set, NULL);//进程组printf("parent pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("parent pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("parent pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());sleep(1); //为了观察子进程退出时,父进程回收子进程资源}else{perror("fork");exit(1);}return 0;
}

  1. 子进程成为一个进程组时,上面的代码加入如下代码后
setpgid(0, 0); //pid = 0, pgid = 0,让当前进程成为一个进程组,并且进程组id为当前进程的pid
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>void do_sigchld(int signo)
{pid_t pid;int status;printf("signo = %d\n", signo);while((pid = waitpid(0, &status, WNOHANG)) > 0) // 0:跟调用进程同组的子进程,WNOHANG:不阻塞,立即返回{if (WIFEXITED(status))printf("child %d exit status %d\n", pid, WEXITSTATUS(status));else if (WIFSIGNALED(status))printf("chid %d exit by signal %d\n", pid, WTERMSIG(status));} 
}int main(int argc, char *argv[])
{pid_t pid;//阻塞SIGCHLD信号sigset_t set;sigemptyset(&set);sigaddset(&set, SIGCHLD);sigprocmask(SIG_BLOCK, &set, NULL);pid = fork();if (pid == 0){//in child//解除阻塞SIGCHLD信号sigprocmask(SIG_UNBLOCK, &set, NULL);//进程组printf("child pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("child pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("child pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());setpgid(0, 0); //pid = 0, pgid = 0,让当前进程成为一个进程组,并且进程组id为当前进程的pidprintf("after setpgid(0, 0) child pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("after setpgid(0, 0) child pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("after setpgid(0, 0) child pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());}else if (pid > 0){//in parent//先捕捉SIGCHLD信号struct sigaction act;act.sa_handler = do_sigchld;sigemptyset(&act.sa_mask);act.sa_flags = 0; //0:用sa_handler参数,SA_SIGINFO:用sa_sigaction参数sigaction(SIGCHLD, &act, NULL);//再解除阻塞SIGCHLD信号sigprocmask(SIG_UNBLOCK, &set, NULL);//进程组printf("parent pid = %d, process group id getpgid(0) = %d\n", getpid(), getpgid(0));printf("parent pid = %d, process group id getpgid(getpid()) = %d\n", getpid(), getpgid(getpid()));printf("parent pid = %d, process group id getpgrp() = %d\n", getpid(), getpgrp());sleep(1); //为了观察子进程退出时,父进程回收子进程资源}else{perror("fork");exit(1);}return 0;
}

相关文章:

进程组和用处

进程组&#xff1a;一个或多个进程的集合&#xff0c;进程组id是一个正整数。组长进程&#xff1a;进程组id 进程id组长进程可以创建一个进程组&#xff0c;创建该进程组的进程&#xff0c;终止了&#xff0c;只要进程组有一个进程存在&#xff0c;进程组就存在&#xff0c;与…...

Nacos集群+Nginx负载均衡

搭建Nacos集群 注意: 3个或3个以上Nacos节点才能构成集群。要求服务器内存分配最好大于6G以上&#xff08;如果不够则需修改nacos启动脚本中的默认内存配置&#xff09;根据nacos自带的mysql建库脚本建立对应数据库&#xff08;/conf/nacos-mysql.sql&#xff09;如果是三台服…...

TypeScript 学习之类型兼容

TypeScript 的类型兼容性是基于结构子类型的。 结构类型是一种只使用其成员来描述类型的方式。 interface Named {name: string; }class Person {name: string; }let p: Named; p new Person();// 赋值成功&#xff0c;因为都是结构类型&#xff0c;只要Person 类型的包含 Nam…...

Linux软件管理RPM

目录 前言 RPM软件管理程序&#xff1a;rpm RPM默认安装的路径 PRM讲解前准备工作 RPM安装&#xff08;install&#xff09; RPM查询&#xff08;query&#xff09; RPM卸载&#xff08;erase&#xff09; RPM升级与更新&#xff08;upgrade/freshen&#xff09; RPM重…...

01背包问题

背包问题的递归解决过程如下&#xff1a; 第一步明确思路 在解决问题之前&#xff0c;为描述方便&#xff0c;首先定义一些变量&#xff1a;Vi表示第 i 个物品的价值&#xff0c;Wi表示第 i 个物品的体积&#xff0c;定义V(i,j)&#xff1a;当前背包容量 j&#xff0c;前 i 个…...

14_FreeRTOS二值信号量

目录 信号量的简介 队列与信号量的对比 二值信号量 二值信号量相关API函数 实验源码 信号量的简介 信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。 假设有一个人需要在停车场停车 1.首先判断停车场是否还有空车位(判断信号量是否有资源) 2.停车场正好…...

JavaScript随手笔记---轮播图(点击切换)

&#x1f48c; 所属专栏&#xff1a;【JavaScript随手笔记】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…...

机器人学 markdown数学公式常用语法

参考链接1 本文包含了markdown常用的数学公式&#xff0c;按照目录可查询选用 初始类 行内数学公式均用两个符号包裹行间数学公式均用两个符号包裹 行间数学公式均用两个符号包裹行间数学公式均用两个符号包裹&#xff0c;用于表示重要的、需在行间单独列出的公式 $行内数学…...

如何使用 Python 语言来编码和解码 JSON 对象

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写。 JSON 函数 使用 JSON 函数需要导入 json 库&#xff1a;import json。 函数 描述 json.dumps 将 Python 对象编码成 JSON 字符串 json.loads 将已编码的 JSON 字符串解码为 Pyth…...

【蓝桥云课】求正整数的约数个数

一、求正整数n的约数个数 方法一(常用算法)&#xff1a;从1到n逐一判断其能否整除n&#xff0c;若能整除n即为n的约数&#xff0c;否则不是n的约数。 方法二&#xff1a;从1到n\sqrt{n}n​逐一判断是否为n的约数&#xff0c;当n\sqrt{n}n​为n的约数时&#xff0c;个数加1&…...

刷题记录: wannafly25 E 牛客NC19469 01串 [线段树维护动态dp]

传送门:牛客 题目描述: Bieber拥有一个长度为n的01 串&#xff0c;他每次会选出这个串的一个子串作为曲谱唱歌&#xff0c;考虑该子串从左 往右读所组成的二进制数P。 Bieber每一秒歌唱可以让P增加或减少 2 的 k次方&#xff08;k由Bieber选 定&#xff09;&#xff0c;但必须…...

懂九转大肠的微软New Bing 内测申请教程

最近微软的New Bing开放内测了&#xff0c;网上已经有拿到内测资格的大佬们对比了ChatGPT和New Bing。对比结果是New Bing比ChatGPT更强大。来看看具体对比例子吧 1.时效性更强 ChatGPT的库比较老&#xff0c;跟不上时事&#xff0c;比如你问它九转大肠的梗&#xff0c;ChatG…...

WRAN翻译

基于小波的图像超分辨残差注意力网络 Wavelet-based residual attention network for image super-resolution 代码&#xff1a; https://github.com/xueshengke/WRANSR-keras 摘要&#xff1a; 图像超分辨率技术是图像处理和计算机视觉领域的一项基础技术。近年来&#xff0c…...

ROS学习笔记——第二章 ROS通信机制

主要跟着[1]学习ros::Rate r(1); //错误&#xff0c;应改为ros::Rate r(10);[2]对Topic通信打的比方很形象&#xff0c;便于理解记忆。[3]有整个过程的图片&#xff0c;对于初学者更加友好[4]对发布者的代码注释非常好&#xff0c;方便进一步学习此外CMake官方文档可以查询相关…...

MacOS Pytorch 机器学习环境搭建

学习 Pytorch &#xff0c;首先要搭建好环境&#xff0c;这里将采用 Anoconda Pytorch PyCharm 来一起构建 Pytorch 学习环境。 1. Anoconda 安装与环境创建 Anoconda 官方介绍&#xff1a;提供了在一台机器上执行 Python/R 数据科学和机器学习的最简单方法。 为什么最简单…...

项目——博客系统

文章目录项目优点项目创建创建相应的目录&#xff0c;文件&#xff0c;表&#xff0c;导入前端资源实现common工具类实现拦截器验证用户登录实现统一数据返回格式实现加盐加密类实现encrypt方法实现decrypt方法实现SessionUtil类实现注册页面实现前端代码实现后端代码实现登录页…...

PHP(14)会话技术

PHP&#xff08;14&#xff09;会话技术一、概念二、分类三、cookie技术1. cookie的基本使用2. cookie的生命周期3. cookie的作用范围4. cookie的跨子域5. cookie的数组数据四、session1. session原理2. session基本使用3. session配置4. 销毁session一、概念 HTTP协议是一种无…...

对JAVA 中“指针“理解

对于Java中的指针&#xff0c;以下典型案例会让你对指针的理解更加深刻。 首先对于&#xff1a; 系统自动分配对应空间储存数字 1&#xff0c;这个空间被变量名称b所指向即: b ——> 1 变量名称 空间 明…...

功率放大器在MEMS微结构模态测试研究中的应用

实验名称&#xff1a;功率放大器在MEMS微结构模态测试研究中的应用研究方向&#xff1a;元器件测试测试目的&#xff1a;随着MEMS器件在各个领域中广泛应用&#xff0c;对微结构进行模态测试获得其动态特性参数对微结构的设计、仿真、制造、以及质量控制和评价等方面具有十分重…...

【算法基础】字典树(Trie树)

一、Trie树原理介绍 1. 基本概念 Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。【高效存储和查找字符串集合的数据结构】,存储形式如下: 2. 用数组来模拟Trie树的…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...