Linux进程通信:进程组 会话
1. 进程组
(1)概念:一个或多个进程的集合,也称为“作业”。
(2)父进程创建子进程时,默认属于同一个进程组。进程组ID为组长进程ID。
(3)进程组中只要有一个进程存在,进程组就存在,与组长进程是否终止无关。
(4)父子进程可不属于同一进程组。
进程组相关函数
(1)getpgrp函数
#include<unistd.h>pid_t getpgrp(void);
/*
功能:获取当前进程的进程组ID
返回值:总是成功。
*/
(2)getpgid函数
#include<unistd.h>pid_t getpgid(pid_t pid);
/*
功能:获取指定进程的进程组ID
参数:pid:进程号;若为0,则功能和getpgrp一样
返回值:成功:进程组ID失败:-1
*/
(3)setpgid函数
#include<unistd.h>int setpgid(pid_t pid, pid_t pgid);
/*
功能:将进程pid的进程组改为pgid;可创建新的进程组
返回值:成功:0失败:-1
*/
2. 会话
概念:一个或多个进程组的集合。
创建会话注意事项:
(1)组长进程不能创建会话,否则返回出错;
(2)创建会话的非组长进程变成新会话的首进程(session header,也称为会长进程),同时会创建一个新进程组并成为组长进程(因为新会话中至少要有一个进程组);
(3)组长进程不会成为新会话首进程,新会话首进程会成为组长进程;
(4)需要root权限(Ubuntu等除外);
(5)新会话丢弃原有控制终端,该会话无控制终端;
(6)创建新会话时:先调用fork,父进程终止,子进程调用setsid(创建会话函数);
会话相关函数:
(1)getsid函数:
#include<unistd.h>pid_t getsid(pid_t pid);
/*
功能:获取进程所属的会话
参数:pid:进程号;若为0则表示查看当前进程的会话ID
返回值:成功:会话ID失败:-1
*/
getsid示例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>int main(int argc, const char* argv[]) {pid_t pid = -1;// 获取当前进程组会话IDpid = getsid(0);if (-1 == pid) {perror("getsid");return 1;}printf("当前进程的会话ID:%d\n", pid);return 0;
}
运行结果:
(2)setsid函数
#include<unistd.h>pid_t setsid(void);
/*
功能:创建新会话,并用自己的ID设置为新进程组ID和新会话ID;该进程将成为新进程组组成和新会话会长。
返回值:成功:新会话ID;失败:-1.
*/
setsid示例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>int main(int argc, const char* argv[]) {pid_t pid = -1;printf("父进程pid:%d\n", getpid());printf("父进程所属进程组的组长进程pid:%d\n", getpgrp());printf("父进程所属会话的会长进程pid:%d\n", getsid(0));// 创建新会话printf("父进程%d即将创建新会话...\n", getpid());pid = setsid(); // 失败if (-1 == pid) {printf("创建失败!父进程为组长进程,组长进程不可创建新会话..\n");perror("setsid");}pid = fork();if (-1 == pid) {perror("fork");return 1;}if (0 == pid) { // 子进程printf("\n子进程创建成功!其pid:%d,其组长进程:%d\n", getpid(), getpgrp());printf("子进程%d即将创建新会话...\n", getpid());pid = setsid(); // 创建会话if (-1 == pid) {perror("setsid");return 1;}printf("子进程创建新会话成功\n");printf("子进程所属进程组的组长进程pid:%d\n", getpgrp());printf("子进程所属会话的会长进程pid:%d\n", getsid(0));printf("子进程的父进程pid:%d\n", getppid());} else {sleep(2);printf("\n子进程创建会话后,父进程情况:\n");printf("父进程所属进程组的组长进程pid:%d\n", getpgrp());printf("父进程所属会话的会长进程pid:%d\n", getsid(0));while (1) {sleep(1);}}return 0;
}
运行结果:
结果可知:
(1)组长进程不可创建新会话;
(2)非组长进程(这个示例中的子进程)创建新会话后会成为新会话的会长,同时也会创建一个新进程组并成为组长(因为新会话中至少要有一个进程组);
(3)子进程创建新会话成为新会长和新组长后,并不会影响父进程的组长和会长;
(4)父子进程可不属于同一个进程组,也可不属于同一会话。
相关文章:
Linux进程通信:进程组 会话
1. 进程组 (1)概念:一个或多个进程的集合,也称为“作业”。 (2)父进程创建子进程时,默认属于同一个进程组。进程组ID为组长进程ID。 (3)进程组中只要有一个进程存在&a…...
【前端面经】JS-深浅拷贝
理解深浅拷贝 深浅拷贝问题的出现是由于JavaScript对不同类型的存储方式而引发的。 对于原始数据类型,它们的值是直接存储在栈内存中; 而复杂数据类型,则在栈内存中记录它的指针,而指针指向堆内存中真正的值。 所以对于原始数据类…...
【自然语言处理】实验2布置:Word2Vec TransE案例
NLP_class 学堂在线《自然语言处理》实验课代码报告,授课老师为刘知远老师。课程链接:https://www.xuetangx.com/training/NLP080910033761/1017121?channeli.area.manual_search。 持续更新中。 所有代码为作者所写,并非最后的“标准答案…...
Redis集合底层实现原理
目录 本章重点简单动态字符串SDS集合底层实现原理zipListlistPackskipListquickListKey 与Value中元素的数量 本章重点 掌握Redis简单动态字符串了解Redis集合底层实现原理 简单动态字符串SDS SDS简介 我们Redis中无论是key还是value其数据类型都是字符串.我们Redis中的字符…...
OVS常用命令与使用总结
OVS常用命令与使用总结 说明 在平时使用ovs中,经常用到的ovs命令,参数,与举例总结,持续更新中… 进程启动 1.先准备ovs的工作目录,数据库存储路径等 mkdir -p /etc/openvswitch mkdir -p /var/run/openvswitch …...
一以贯之:从城市网络到“城市一张网”
《论语里仁》中子曰:“参乎,吾道一以贯之”。 孔子所说的“一以贯之”,逐渐成为了中国文化与哲学的重要组成部分,指明事物发展往往需要以标准化、集约化、融合化作为目标。这种智慧在数字化发展中格外重要。从云计算、大数据技术模…...
【Java校招面试】基础知识(四)——JVM
目录 前言一、基础概念二、反射三、类加载器ClassLoader四、JVM内存模型后记 前言 本篇主要介绍Java虚拟机——JVM的相关内容。 “基础知识”是本专栏的第一个部分,本篇博文是第四篇博文,如有需要,可: 点击这里,返回…...
项目管理-计算专题(三点估算、PERT估算)
基本概念 通过考虑估算中的不确定性和风险,可以提高活动持续时间估算的准确性。这个概念源自计划评审技术(PERT)。PERT使用三种估算值来界定活动持续时间的近似区间: 最可能时间(tM):基于最可能获得的资源、最可能取得的资源生产率、对资源可用时间的现…...
【华为OD机试 2023最新 】模拟商场优惠打折(C语言题解 100%)
文章目录 题目描述输入描述输出描述用例题目解析代码思路C语言题目描述 模拟商场优惠打折,有三种优惠券可以用,满减券、打折券和无门槛券。 满减券:满100减10,满200减20,满300减30,满400减40,以此类推不限制使用; 打折券:固定折扣92折,且打折之后向下取整,每次购…...
使用TrieTree(字典树)来实现敏感词过滤
使用TrieTree(字典树)来实现敏感词过滤 1. 字典树定义 字典树(TrieTree),是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串,如01字典树)。…...
USB转串口芯片CH9101U
CH9101是一个USB总线的转接芯片,实现USB转异步串口。提供了常用的MODEM联络信号,用于为计算机扩展异步串口,或者将普通的串口设备或者MCU直接升级到USB总线。 特点 全速USB设备接口,兼容USB V2.0。内置固件,仿真标准串…...
Java语言介绍
Java是一种广泛使用的计算机编程语言,由Sun Microsystems公司于1995年推出。它是一个健壮的、面向对象的、跨平台的语言,被用于开发各种应用程序和系统,包括Web应用程序、移动应用程序、桌面应用程序、游戏以及企业级系统等。 Java具有许多优…...
终于把 vue-router 运行原理讲明白了(二)!!!
一、vue-router路由变化侦测 1.1 上一遍文章中,介绍了vue-router 的install 函数的内部实现,知道了能在this中访问$router 和视图更新的机制,文章链接终于把 vue-router 运行原理讲明白了(一)!!…...
ChatGPT实现服务器体验沙箱
服务器体验沙箱 IT 人员在学习一门新技术时,第一个入门门槛通常都是"如何在本地安装并成功运行"。因此,很多技术的官网都会通过沙箱技术,提供在线试用的 playground 或者按步模拟的 tour。让爱好者先在线尝试效果是否满足预期&…...
【算法】刷题中的位运算
作者:指针不指南吗 专栏:算法篇 🐾人类做题的过程,其实是暴搜的过程🐾 文章目录 1.位运算概述2.位运算符3.位运算应用3.1整数的奇偶性判断3.2有关 2 的幂的应用3.3lowbit(x)返回x的最后一位13.4二进制数中1的个数3.5求…...
9.Java中异常处理机制是什么
Java的异常处理通过五个关键字来实现,分别是捕获异常:try,catchsfinally;声明异常:throws;抛出异常:throw 一:try,catch捕获异常二:finally回收资源三&#x…...
GeoTools实战指南: 叠加GeoTIFF与Shapefile图层生成截图
GeoTools实战指南: 叠加GeoTIFF与Shapefile图层生成截图 介绍 本教程将介绍如何使用GeoTools库在Java中将栅格数据(GeoTIFF)与矢量数据(Shapefile)叠加显示,并将结果保存为PNG格式的图片文件。我们将解析和分析 RasterDataRenderer 类,并了解其中的每个方法和对象。 准…...
nginx配置sh脚本远程执行一键安装
背景 本地多机重复操作某些shell指令,分步执行,很耗费时间, 需要远程一键部署,傻瓜化运维,更为通用安装。 即参考docker通用安装 sudo curl https://get.docker.com | sh - # sudo python3 -m pip install docker-co…...
Excel表格成绩排名全攻略,让你事半功倍!
在学校或公司中,我们经常需要对成绩进行排名。如果手动计算排名,不仅费时费力,而且容易出错。幸运的是,Microsoft Excel提供了一个简单而快速的方法来计算和显示排名。 在学校或公司中,成绩排名是一项重要的任务。使用…...
Docker 持久化存储 Bind mounts
Docker 持久化存储 Bind mounts Bind mounts 的 -v 与 --mount 区别启动容器基于bind mount挂载到容器中的非空目录只读 bind mountcompose 中使用 bind mount 官方文档:https://docs.docker.com/storage/bind-mounts/ Bind mounts 的 -v 与 --mount 区别 如果使用…...
LVS +Keepalived 高可用群集部署
一、LVSKeepalived 高可用群集 在这个高度信息化的 IT 时代,企业的生产系统、业务运营、销售和支持,以及日常管理等环节越来越依赖于计算机信息和服务,对高可用(HA)技术的应用需求不断提高,以便提供持续的…...
Kafka调优
生产者 参数名称描述bootstrap.serverskafka集群的地址key.deserializerkey的反序列化类,写全类名value.deserializervalue的反序列化类,写全类名buffer.memoryRecordAccumulator缓冲区总大小,默认32mbatch.size缓冲区一批数据最大值&#x…...
Debezium系列之:详细介绍Debezium2.X版本导出Sqlserver数据库Debezium JMX指标的方法
Debezium系列之:详细介绍Debezium2.X版本导出Sqlserver数据库Debezium JMX指标的方法 一、需求背景二、相关技术文章三、安装jmx_prometheus_javaagent四、Debezium2.X版本Sqlserver数据库jmx指标格式五、导出Debezium2.X版本Sqlserver数据库jmx指标方法六、Debezium2.X版本各…...
基于PWM技术的三相光伏逆变器研究(Simulink)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
〖Python网络爬虫实战㉑〗- 数据存储之JSON操作
订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付…...
不得不说的行为型模式-责任链模式
目录 责任链模式: 底层原理: 代码案例: 下面是面试中可能遇到的问题: 责任链模式: 责任链模式是一种行为型设计模式,它允许多个对象在一个请求序列中依次处理该请求,直到其中一个对象能够…...
基于dsp+fpga+AD+ENDAC的半导体运动台高速数据采集电路仿真设计(四)
整个调试验证与仿真分析分三个步骤:第一步是进行 PCB 检查及电气特性测试,主 要用来验证硬件设计是否正常工作;第二步进行各子模块功能测试,包括高速光纤串行 通信的稳定性与可靠性测试, A/D 及 D/A 转换特性测…...
快速搭建Electron+Vite3+Vue3+TypeScript5脚手架 (无需梯子,快速安装Electron)
一、介绍 😆 😁 😉 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需…...
语义分割学习笔记(二)转置卷积
目录 1.转置卷积Transposed Convolution概念 2.转置卷积操作步骤 3.转置卷积参数 4.实战案例 推荐课程:转置卷积(transposed convolution)_哔哩哔哩_bilibili 感谢霹雳吧啦Wz,真乃神人也。 1.转置卷积Transposed Convolutio…...
docker运行PostgreSQL数据库维护,执行脚本备份数据库与更新表结构
文章目录 PostgreSQL简介业务场景数据库维护docker-compose配置备份脚本更新表结构脚本 PostgreSQL简介 PostgreSQL是一种开源的关系型数据库管理系统,它是一个功能强大、高度可定制化和支持复杂应用的数据库。它支持广泛的数据类型,包括数值、文字、二…...
安陆网站建设/网站建设品牌公司
【SymPy】(一)SymPy简介 【SymPy】(二)使用SymPy需要避开的坑 【SymPy】(三)基本操作(四)打印 简化 文章目录简化1 simplify2 多项式/有理函数简化2.1 expand2.2 factor2.2.3 colle…...
做医院网站公司/线上销售平台如何推广
单播:单播MAC地址是从源到目的的唯一地址。 广播:就是一个主机向所有主机发送一个数据包。 组播:就是把数据发送给一组主机或者发送给感兴趣的主机。(组播的MAC地址是以:01-00-5E开头的,组播的IP地址224.0.…...
简洁大气的企业网站/seo优化与品牌官网定制
2019独角兽企业重金招聘Python工程师标准>>> 今天看element-react源码的时候,又看到了这张似曾相识却又异常陌生的老面孔,那就是Function.prototype.apply()... import React from react; import PropTypes from prop-types; import classnam…...
wordpress logy/创意营销案例
这次博客主要是和大家分享数据库这块关于建立动态数据库的一些想法,我总结了一个文档,供大家交流,欢迎大家提意见啊! 起因: 上次考试系统的数据量太大,导致有部分学生数据没有写进入,经讨论研究…...
网址大全2345色综合导航/最专业的seo公司
urllib-Python3文档链接致谢python修行路 1.初识urllib urllib库包含以下模块: urllib.request——打开和读取 URLsurllib.error——urllib.request异常处理urllib.parse——解码URLsurllib.robotparser——解码robots.txt 2.urllib爬虫 2.1 简单的get方法 简…...
网站开发架构分类/郑州做网站推广电话
原因:js按照2进制来处理小数的加减乘除,在arg1的基础上 将arg2的精度进行扩展或逆扩展匹配,所以会出现如下情况. javascript(js)的小数点加减乘除问题,是一个js的bug如0.3*1 0.2999999999等,下面列出可以完美求出相应精度的四种js算法 ?12345678910111…...