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

系列文章:
操作系统详解(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.mzph.cn/news/626629.shtml

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

相关文章

MySQL进阶45讲【1】基础架构:一条SQL查询语句是如何执行的?

1 前言 我们经常说&#xff0c;看一个事儿千万不要直接陷入细节里&#xff0c;应该先鸟瞰其全貌&#xff0c;这样能够帮助你从高维度理解问题。同样&#xff0c;对于MySQL的学习也是这样。平时我们使用数据库&#xff0c;看到的通常都是一个整体。比如&#xff0c;有个最简单的…

锐意进取,蓬勃发展|爱基百客2023全景图

岁序更迭&#xff0c;2023年已悄然离去。对我们来说&#xff0c;这是充满挑战与机遇的一年。爱基百客作为一家专注于测序服务的公司&#xff0c;我们在这一年里经历了许多挑战&#xff0c;也取得了令人鼓舞的成绩。前面我们盘点了表观产品和单细胞产品&#xff0c;今天再邀您回…

AI工具推荐:开源TTS(文本生成语音)模型集合

XTTS TTS是一个语音生成模型&#xff0c;可以通过一个简短的6秒音频片段将声音克隆到不同的语言。它不需要大量的训练数据&#xff0c;也不需要耗费大量时间。TTS支持17种语言&#xff0c;可以进行声音克隆、情感和风格转移、跨语言声音克隆以及多语言语音生成等功能。XTTS-v2…

徐州数字孪生元宇宙赋能工业智能制造,助力传统制造业数字化转型

徐州数字孪生元宇宙赋能工业智能制造&#xff0c;助力传统制造业数字化转型。在徐州市制造业企业数字化转型的过程中&#xff0c;数字孪生技术的应用已经取得了显著成效。一方面&#xff0c;企业的生产效率得到了显著提高&#xff0c;产品质量也得到了有效保障。另一方面&#…

LLM:Scaling Laws for Neural Language Models (中)

核心结论 1&#xff1a;LLM模型的性能主要与计算量C&#xff0c;模型参数量N和数据大小D三者相关&#xff0c;而与模型的具体结构 (层数/深度/宽度) 基本无关。三者满足: C ≈ 6ND 2. 为了提升模型性能&#xff0c;模型参数量N和数据大小D需要同步放大&#xff0c;但模型和数…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二)

购物车相关 1.添加购物车1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 1.2 代码开发1.2.1 DTO设计1.2.2 Controller层1.2.3 Service层接口1.2.4 Service层实现类1.2.5 Mapper层 2. 查看购物车2.1 需求分析和设计2.1.1 产品原型2.1.2 接口设计 2.2 代码开发2.2.…

K8S----YAML

kubernetes中资源可以使用YAML描述&#xff08;如果您对YAML格式不了解&#xff0c;可以参考YAML语法&#xff09;&#xff0c;也可以使用JSON。其内容可以分为如下四个部分&#xff1a; typeMeta&#xff1a;对象类型的元信息&#xff0c;声明对象使用哪个API版本&#xff0c…

L1-027 出租(Java)

下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&#xff0c;index[1]0 对应 arr[0]8&#xff0c;index[2]3 对应 arr[3]0&…

Android Studio安卓读取EM4100 TK4100卡卡号源码

本示例使用的读卡器&#xff1a;https://item.taobao.com/item.htm?spma1z10.5-c.w4002-21818769070.35.44005b43nb1q2h&id562957272162 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmln…

2024年【安全生产监管人员】复审考试及安全生产监管人员模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产监管人员复审考试是安全生产模拟考试一点通总题库中生成的一套安全生产监管人员模拟考试题库&#xff0c;安全生产模拟考试一点通上安全生产监管人员作业手机同步练习。2024年【安全生产监管人员】复审考试及…

Unity 编辑器篇|(六)编辑器拓展EditorGUI类 (全面总结 | 建议收藏)

目录 1. 前言2. 参数3. 功能3.1 折叠菜单&#xff1a; Foldout3.2 检查 GUI 更改&#xff1a; BeginChangeCheck 、EndChangeCheck 监听值改变3.3 可禁用控件&#xff1a;BeginDisabledGroup 、EndDisabledGroup 是否禁用组中的控件3.4 下拉菜单&#xff1a;DropdownButton3.5 …

CentOS7安装MySQL 错误:软件包:akonadi-mysql-1.9.2-4.el7.x86_64 (@anaconda)

问题如图所示 运行一下命令解决 yum -y remove mariadb-libsyum install mysql-community-server

PriorityBlockingQueue概念

四、PriorityBlockingQueue概念 4.1 PriorityBlockingQueue介绍 首先PriorityBlockingQueue是一个优先级队列&#xff0c;他不满足先进先出的概念。 会将查询的数据进行排序&#xff0c;排序的方式就是基于插入数据值的本身。 如果是自定义对象必须要实现Comparable接口才可…

如何学习three.js

如何学习three.js 前言1. 基础概念场景&#xff08;Scene&#xff09;&#xff1a; three.js中所有物体的容器。你可以把它想象成一个舞台&#xff0c;在这里添加物体、光源等。相机&#xff08;Camera&#xff09;&#xff1a; 决定了哪部分场景会被渲染。最常用的是透视相机&…

MongoDB面试系列-01

1. MongoDB 是什么&#xff1f; MongoDB是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。再高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。MongoDB旨在给Web应用提供可扩展的高性能数据存储解决方案。 MongoDB将数据存储…

机器学习算法实战案例:CNN-LSTM实现多变量多步光伏预测

文章目录 1 数据处理1.1 导入库文件1.2 导入数据集1.3 缺失值分析 2 构造训练数据​3 模型训练3.1 CNN-LSTM网络3.2 模型训练 4 模型预测答疑&技术交流机器学习算法实战案例系列 1 数据处理 1.1 导入库文件 from matplotlib import pyplot as pltimport tensorflow as tf…

PHP+MySQL组合开发:微信小程序万能建站源码系统 附带完整的搭建教程

随着移动互联网的快速发展&#xff0c;微信小程序已成为企业进行移动营销的重要工具。然而&#xff0c;对于许多中小企业和个人开发者来说&#xff0c;开发一个功能完善、用户体验良好的小程序是一项复杂的任务。罗峰给大家分享一款微信小程序万能建站源码系统。该系统采用PHPM…

CMMI3.0认证的卓越方案!

CMMI3.0是软件工程和组织发展领域中的一项重要认证&#xff0c;它旨在提升组织的绩效和成熟度&#xff0c;促进卓越的软件开发和管理实践。本文将探讨CMMI3.0认证的意义、要求以及实施过程&#xff0c;并介绍一些卓越方案&#xff0c;帮助组织达到该认证。 CMMI3.0认证的意义 …

线控底盘新玩家凶猛!这家企业的ONE-BOX产品正式量产下线

高工智能汽车获悉&#xff0c;12月27日&#xff0c;威肯西科技宣布旗下ONE-BOX线控制动产品--液压解耦制动系统HDBS实现量产下线。该产品将与多个汽车品牌签署量产及定点协议&#xff0c;预计年产量达到60万套。 据了解&#xff0c;作为耀宁科技集团的一级子公司&#xff0c;威…

【正点原子】STM32电机应用控制学习笔记——8.FOC简介

FOC是适用于无刷电机的&#xff0c;而像有刷电机&#xff0c;舵机&#xff0c;步进电机是不适用FOC的。FOC是电机应用控制难度最大的部分了。 一.FOC简介&#xff08;了解&#xff09; 1.介绍 FOC&#xff08;Filed Oriented Control&#xff09;即磁场定向控制&#xff0c;…