操作系统详解(5.2)——信号(Signal)的题目进阶

news2025/2/24 23:44:59

系列文章:
操作系统详解(1)——操作系统的作用
操作系统详解(2)——异常处理(Exception)
操作系统详解(3)——进程、并发和并行
操作系统详解(4)——进程控制(fork, waitpid, sleep, execve)
操作系统详解(5)——信号(Signal)
操作系统详解(5.1)——信号(Signal)的相关题目

文章目录

  • 题目
  • Q1
  • Q2
  • Q3
  • Q4

题目

(如果有错误,欢迎指正)

const int num = 4;
volatile sig_atomic sum = 0, child = 0;
volatile sig_atomic n = num;
void handler_chld(int sig){
	int status;
	while(waitpid(-1, &status, 0) > 0){
		if(WIFEXITED(status)){
			sum += WEXITSTATUS(status);
			n += 1;
			child += 1;
		}
	}
}
int main()
{
	sigset_t mask_all, prev_one;
	sigemptyset(&mask_all);
	sigaddset(&mask_all, SIGCHLD);
	sigprocmask(SIG_BLOCK, &mask_all, &prev_one);
	signal(SIGCHLD, handler_chld);
	while(1){
		if(n == 0) exit(0);
		if(n == 1) exit(1);
		n = n - 1;
		if(fork() == 0) continue;
		n = n - 1;
		if(fork() == 0) continue;
		break;
	}
	sigprocmask(SET_MASK, &prev_ont, NULL);
	if(child < 2) pause();
	if(n == sum){
		printf("f[%d] = %d\n", n, sum);
	}
	exit(sum);
}
  • Q1: 程序一共fork了几次?
  • Q2: 为什么要把SIGCHLD阻塞?
  • Q3: pause()是否一定会返回?
  • Q4: 程序的输出是什么? 如果改成const int num = 9呢?

Q1

首先画出程序的流程图
(画图是解决此类题型的重要方法)
屏幕截图 2024-01-15 194744.png
可见一共fork了8次

Q2

要把SIGCHLD阻塞,肯定是在fork()期间不能被信号干扰。
观察handler内,发现会修改n, child的值。而fork()会使子进程与父进程拥有相同的变量值。以child为例,如果不屏蔽信号,那么很可能会使进程接收到信号后使child+1=1, 那么当fork以后,子进程的child也为1,就无法保证子进程在fork()以后,能够pause()等待回收子进程。

Q3

在此例中,pause()是一定可以返回的。
handler里是一个while循环,条件是waitpid, 这样可以保证只需要收到一个信号就可以回收所有子进程,不会出现多个信号发送被覆盖的情况。
假如所有信号都在UNBLOCK之前收到,那么UNBLOCK的时候就会执行handler, 并且回收所有子进程,这样就会使child >=2,不会执行pause().
(所有的父进程的子进程个数一定>=2,下一问会分析)

如果在UNBLOCK之前收到了一个signal:

  • 如果在handler中又收到了信号,则会在结束后紧接着再次执行handler,使得child>=2, 不会执行pause()
  • 如果在pause()后收到信号,则会打断pause()

如果在pause()以后才收到信号,则会打断pause, 并且在handler中等待回收所有的子进程。

Q4

上面的流程图虽然表明了n的取值,但是不能反映出父进程与子进程之间的关系。
先举一个简单的例子:假设进程p1经过fork()以后得到p1和p2,二者分别再fork得到p3和p4。
屏幕截图 2024-01-15 203057.png

  • p1是p2和p3的父亲
  • p2是p4的父亲

与流程图相对应的话,以最上方的parent为例,它的子进程包括

  1. child fork 后得到的父进程
  2. 前一次(即第一次)fork 得到的子进程fork()两次之后的父进程

语言描述比较抽象,图中用笔圈出了关系:
x2.png

类似的还有:
x3.png

弄清楚了fork()多次后得到的父子进程的关系,我们就可以着手分析sum的值了. 由题意可知父进程的返回值为所有子进程的返回值之和,且每有一个子进程执行n+1. 用图表示:
x0.png
故输出是:f[4] = 3

如果改成num = 9:由上图标红的n=4, n=3, n=2可以知道,sum分别是3, 2, 1.
有sum = num - 1
故num = 9时, sum = 8
输出f[9] = 8

如果你不相信的话,我们假设num = 3, 再画一下流程图:
xx.png
可以验证sum = 2;

Q3中的问题:由于fork()以后子进程最后一定会直接exit返回,所以跳出while循环的父进程最少拥有两个子进程

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux终端上传github提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交

问题&#xff1a; 提示&#xff1a;更新被拒绝&#xff0c;因为远程仓库包含您本地尚不存在的提交。这通常是因为另外 提示&#xff1a;一个仓库已向该引用进行了推送。再次推送前&#xff0c;您可能需要先整合远程变更 提示&#xff1a;&#xff08;如 git pull ...&#xff…

走进Spring Boot 3.x时代(一)

目录 前言Spring Boot 2.x 时代Spring Boot 3.x 时代Spring Boot 3.x 新特性JDK调整平滑升级依赖调整最低环境要求配置属性兼容提高应用可观察性Jakarta EE升级的关键变更支持 GraalVM 原生镜像三方包升级Log4j2增强ConstructorBinding检测优化Micrometer 升级Micrometer Trac…

有哪些免费3D模型网站值得推荐?

设计师们经常需要一些免费的3D模型网站用来寻找各种类型的3D模型&#xff0c;如人物、动物、车辆、建筑、道具等&#xff0c;从而满足不同的设计需求以及设计灵感。那么有哪些免费3D模型网站值得推荐&#xff1a; ①建e网&#xff1a;建e网是一个提供3D模型下载的平台&#xff…

D20XB100-ASEMI开关电源桥堆D20XB100

编辑&#xff1a;ll D20XB100-ASEMI开关电源桥堆D20XB100 型号&#xff1a;D20XB100 品牌&#xff1a;ASEMI 封装&#xff1a;GBJ-5&#xff08;带康铜丝&#xff09; 平均正向整流电流&#xff08;Id&#xff09;&#xff1a;20A 最大反向击穿电压&#xff08;VRM&#…

【Python3】【力扣题】387. 字符串中的第一个唯一字符

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;遍历字符串&#xff0c;依次判断元素在字符串中的个数是否为1&#xff0c;第一个为1的返回该元素的索引号&#xff0c;若整个字符串都没有个数为1的&#xff0c;则返回-1。 知识点&#…

基于ssm的学籍管理系统论文

摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮或者怕火&#xff0c;不容易备份&#xff0c;需要花费大量的人员和资金来管理用纸质文…

vue+echarts 几个案例

普通柱状图 <template><!-- 容器默认宽高是0 如果不设置 页面不显示--><div ref"mychart" id"mychart"></div> </template><script> import * as echarts from "echarts" import axios from axiosexport …

致大家的一封信2024 — 对称性原理

紫光集团董事长李滨先生&#xff0c;作为融信产业联盟理事长每年都会为联盟成员发布一封新年信&#xff0c;与各联盟伙伴分享新一年的思考与感悟。今年&#xff0c;李滨先生围绕“对称性原理”进行了2024年的新年分享&#xff0c;并向大家带来新一年的美好祝福。 原文如下&…

python 二次封装Modbus库实现设备间Modbus通信

前言&#xff1a; 想想好久没有更博客了&#xff0c;今天忙中偷闲准备写一篇Modbus相关的分享。在进入工业领域之前我一直从事软件行业的测试工作&#xff0c;所以也没听过Modbus协议&#xff0c;但是自从进入西门子工作后正式进入了工业领域&#xff0c;所以对Modbus协议也就…

chromium+clangd快速代码跳转

在开发chromium的时候我们使用vscode工具进行开发&#xff0c;如果使用C插件发现很容就卡死计算机了。 所以我们使用clangd工具来查看chromium的代码。 一、安装 在vscode中安装还是很简单的。 输入cland&#xff0c;点击安装即可 二、生成编译数据库 代码编译完成后&…

javascript的变量存储机制和原理

前言 在了解javascript的变量存储机制之前需要了解javascript的数据类型&#xff0c;在js中&#xff0c;数据类型分为基本数据类型和引用数据类型。二者存在内存中&#xff0c;基本类型存在栈中&#xff0c;引用类型存储在堆里。 想查看javascript数据类型详细介绍请访问&…

Spring中的事件机制

文章目录 摘要正文jdk事件Spring事件Spring事件监听ApplicationContext主动监听注解监听Bean监听 Spring事件发布 总结 摘要 在这篇文章我们将介绍Spring的事件机制&#xff0c;包括Spring内置事件、自定义事件、事件监听、事件发布、事件广播机制、事件异常处理等内容。Sprin…

Codeforces Round 919 (Div. 2)

Problem - A - Codeforces n个约束条件 a x 求出满足n个约束条件的整数的个数 大于等于x&#xff0c;取最大的 小于等于x&#xff0c;取最小的 然后不等于x的&#xff0c;记录在区间范围内的个数&#xff0c;减去这些 #include<bits/stdc.h> #define endl \n #define …

【前后端的那些事】开源!treeSelect树形结构数据展示

文章目录 tree-selector1. 新增表单组件2. 在父组件中引用3. 父组件添加新增按钮4. 树形组件4.1 前端代码4.2 后端代码 前言&#xff1a;最近写项目&#xff0c;发现了一些很有意思的功能&#xff0c;想写文章&#xff0c;录视频把这些内容记录下。但这些功能太零碎&#xff0c…

快速前端开发01

前端开发 1 前端开发1.快速开发网站2.浏览器能识别的标签2.1 编码&#xff08;head&#xff09;2.2 title&#xff08;head&#xff09;2.3 标题2.4 div和span2.4.5 超链接2.4.6 图片小结2.4.7 列表2.4.8 表格2.4.9 input系列&#xff08;7个&#xff09;2.4.10 下拉框2.4.11 多…

PIFA天线设计经验分享

一、PIFA天线模型分析 从IFA天线的Smith圆图可以看出&#xff0c;其阻抗图随着频率的变化范围十分大&#xff0c;从端口Matrix data中的阻抗数据可以看到这一点。对于WIFI 2.4G频段的应用IFA输入阻抗频宽大致可以满足要求&#xff0c;但是对于其他带宽较宽的应用&#xff0c;该…

Hive 数据迁移

一、需求 同步集团的数据到断直连环境。 二、思路 三、同步数据&#xff08;方案&#xff09; 1、环境&#xff1a;断直连模拟环境 2、操作机器&#xff1a;ETL 机器 XX.14.36.216 3、工作路径&#xff1a;cd /usr/local/fqlhadoop/hadoop/bin 4、执行命令&#xff1a; 命令…

优思学院|质量管理应该看哪些书最好?

很多学员问我们&#xff0c;在探索质量管理博大精深的知识之旅中&#xff0c;应该看哪些书最好&#xff1f;我们推荐学员了解质量管理和精益六西格玛方法的发展史&#xff0c;从中了解质量管理思维的演变&#xff0c;及后再了解质量管理的工具和方法论&#xff08;包括从PDCA、…

系统性学习vue-vue组件化编程

vue组件化编程 对组件的理解使用组件创建组件注册组件编写组件标签注意 组件的嵌套VueComponent构造函数Vue实例与组件实例(vm与vc)一个重要的内置关系单文件组件(项目使用) 对组件的理解 就是将可以复用的模块提取为独立个体, 解决依赖关系混乱,复用率不高的问题 组件: 实现应…

CTF CRYPTO 密码学-2

题目名称&#xff1a;enc 题目描述&#xff1a; 字符 ZZZZ X XXZ ZZ ZXZ Z ZXZ ZX ZZX XXX XZXX XXZ ZX ZXZZ ZZXZ XX ZX ZZ 分析 此字段是由Z和X组成的字符&#xff0c;联想到莫斯密码是由.和-组成的所以接下来可以尝试莫斯密码解题 解题过程&#xff1a; Step1&#xff1a;…