操作系统详解(5.1)——信号(Signal)的相关题目

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

文章目录

  • 题目
  • 第一问
  • 第二问
  • 第三问

题目

屏幕截图 2024-01-14 131145.png
屏幕截图 2024-01-14 131332.png

第一问

要解决第一问,我们首先分析一下程序的流程。
第22行到第28行:sigfillset把当前进程的所有信号赋给mask_all, 然后用sigprocmask把所有的信号都Block,并把原来的状态存在prev_one中
然后Signal函数把信号和handler绑定。

第29行到第34行fork() 创建了一个子进程。若在子进程中,则先调用两次alarm.
32行将信号unblock,也就是在32行以后子进程才会收到信号。
于是30行与31行必定会先执行。由于之前从未设置过alarm, 所以30行alarm返回0.
虽然现实中一般两行间是紧接着执行的,或者操作系统中断执行后在非常短的时间后就会将控制流回到下一行。但是这里题目是理想状态下,即操作系统在任意时刻都可能把当前进程阻塞,并且在任意时长以后再恢复。所以31行的alarm可能返回0,1,2. 即30执行完后可能被阻塞了0, 1, 2秒甚至更长的时间。
33行子进程暂时休眠。等被信号唤起后exit退出。

36行到41行:父进程的内容。在39行前,父进程的信号全部被BLOCKED. 38行向子进程发送了SIGALRM信号。最后是一个while循环,等待子进程返回。

handler里的内容
可以知道,handler想要执行,必定在子进程执行32行之后。初次执行从第8行开始。第9行再次调用alarm. 但是由于handler会block自身的信号,所以只是设置pending bit, 不会再次执行Handler.
这里的alarm会返回什么呢?由于前一次alarm是3秒,所以这里的返回值可能是0,1,2,3. 之所以会有这些区别,是因为handler并不一定是被alarm(3)触发。前一次的alarm(2)和alarm(3)间可能有两秒以上的间隔使得alarm(2)结束后向子进程发送SIGALRM信号。并且,父进程中的kill也可以触发handler

11行接着向父进程发送SIGUSR1信号,对应的handler在第18行。那么18行一定会执行吗?答案是对的。即使父进程设置了block, 但是第39行unblock信号后还是会check pending bit,这时候就会执行handler_usr1.

回到子进程。第12行子进程休眠5秒,当然随时有可能被Exception打断(比如说其它信号,或者收到了一个网络包什么的)。第13行向子进程自己发送了SIGUSR2. 执行完第13行进程会立刻执行handler_usr2. 一般情况下,信号的生效时间是不确定的。但在此例中,由于kill是一个系统调用,而系统在从内核态返回用户态时会check pendning bit. 由于发现SIGUSR2还没有被接收,所以会执行handler_usr2.

执行完了handler,子进程回到原来的控制流位置。这里很有意思的是,第33行的 pause() 函数有可能不会返回,也就是说子进程可能会永久休眠。这是因为,很可能在39行UNBLOCK信号以后,handler就处理了所有进程的SIGALRM信号,pause 以后没有再接收信号,故不会返回。这种情况下第20行的handler_chld就不执行。所以第20行是可能执行的。

而第5&6行是不可能被执行到的。前面说过,handler不会被同种信号再次打断,所以一旦执行过一次handler, pre_alarm和post_alarm都会置1,所以不存在post_alarm为0而pre_alrm为1的情况。

所以第一问的答案是:

LineVisibilityPossible return values of alarm()
5&6F----
9&10T0/1/2/3
15T------
18T------
19T------
20M------
30T0
31T0/1/2
36T------

第二问

程序的详细逻辑已经在上面分析过了,第二问就是把过程以流程图呈现。主要是弄清楚哪些行是某一行的必要条件,比方说只有unblock信号后才可能执行handler

  • 30在31前
  • 31在9&10前
  • 9&10在15前
  • 15在19前
  • 19在20前
  • 36在20前
  • 36在18前
  • 9&10在18前

时序图:
image.png

第三问

由代码可知,第30,31,38,9行都可能会向子进程发送信号, 故最多发送4个信号。
但是最多只会收到3个信号,原因如下:
如果31行的alarm取消了30行的alarm,那么30行的信号就不会发出。
即使30行的alarm没有被取消,第31行和第9行的信号最多只会收到一个:
如果31行的alarm()结束了以后才解除block,那么31发送信号的pending bit就会被原来30发送的信号覆盖(因为pending signal is not queued)
而如果进入handler后31行的alarm尚未结束,那么在运行第9行时,要么取消了31行的alarm,要么第9行发送的信号被31行发送的pending signal覆盖
所以第31行和第9行的信号最多只会收到一个。

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

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

相关文章

FGSM方法生成交通信号牌的对抗图像样本

背景: 生成对抗样本,即扰动图像,让原本是“停车”的信号牌识别为“禁止驶入” 实验准备 模型:找一个训练好的,识别交通信号牌的CNN模型,灰度图像 模型地址:GitHub - Daulettulegenov/TSR_CNN:…

Wargames与bash知识17

Wargames与bash知识17 Bandit25(Bandit26) 关卡提示 从bandit25登录到bandit26应该相当容易…用户bandit26的shell不是/bin/bash,而是其他东西。找出它是什么,它是如何工作的,以及如何摆脱它。 推荐命令 ssh, cat, …

CSS基础笔记-05layout

CSS基础笔记系列 《CSS基础笔记-01CSS概述》《CSS基础笔记-02动画》《CSS基础笔记-03选择器》《CSS基础笔记-04cascade-specificity-inheritance》 文章目录 CSS基础笔记系列什么是CSS布局布局方法normal flowflexboxgridfloats 总结 什么是CSS布局 CSS布局是指在页面中对元素…

c语言学生管理系统

创建结构体里面包含学生的各种信息。 struct xs {int xh;char xm[20];int gs, yy, wl;double pj;struct xs* next; }; 创建菜单 void menu() {printf("\n************************************\n");printf("* 学生管理系统(1.0&#xff0…

C# 图解教程 第5版 —— 第25章 反射和特性

文章目录 25.1 元数据和反射25.2 Type 类25.3 获取 Type 对象25.4 什么是特性25.5 应用特性25.6 预定义的保留特性25.6.1 Obsolete 特性25.6.2 Conditional 特性25.6.3 调用者信息特性25.6.4 DebuggerStepThrough 特性25.6.5 其他预定义特性 25.7 关于应用特性的更多内容25.7.1…

51-12 多模态论文串讲—BLIP 论文精读

视觉语言预训练VLP模型最近在各种多模态下游任务上获得了巨大的成功,目前还有两个主要局限性: (1) 模型角度: 大多数方法要么采用encoder模型,要么采用encoder-decoder模型。然而,基于编码器的模型不太容易直接转换到文本生成任务&#xff0…

代码随想录 Leetcode242. 有效的字母异位词

题目&#xff1a; 代码&#xff08;首刷看解析 2024年1月14日&#xff09;&#xff1a; class Solution { public:bool isAnagram(string s, string t) {int hash[26] {0};for(int i 0; i < s.size(); i) {hash[s[i] - a];}for(int i 0; i < t.size(); i) {hash[t[i]…

【动态规划】dp多状态问题

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;按摩师&#x1f449;&…

一元二次方程虚数解

对一元二次方程axbxc0 (a≠0)&#xff1b;若判别式△b-4ac<0,则方程无实根,虚数解为&#xff1a;x(-b i√(4ac-b))/(2a)。 只含有一个未知数&#xff08;一元&#xff09;&#xff0c;并且未知数项的最高次数是2&#xff08;二次&#xff09;的整式方程叫做一元二次方程[1] …

如何申请IP地址证书

什么是IP地址证书&#xff1f; IP地址证书是一种用于验证网站服务器身份的数字证书&#xff0c;它可以确保网站与用户之间的通信安全。与传统的域名证书不同&#xff0c;IP地址证书直接针对服务器的IP地址进行认证&#xff0c;适用于没有独立域名的网站或需要对多个域名进行统…

树莓派ubuntu22桌面配置(一)

烧录系统至树莓派 下载系统&#xff1a;https://ubuntu.com/download/raspberry-pi 选择合适的版本下载 镜像安装器安装&#xff1a;终端输入&#xff1a; sudo snap install rpi-imager 打开镜像安装器&#xff0c;按照需求选择树莓派版本与要写入的系统还有安装的u盘 方案…

Python 中的字符串匹配识别文本中的相似性

更多Python学习内容&#xff1a;ipengtao.com 字符串匹配是自然语言处理&#xff08;NLP&#xff09;和文本处理中的一个重要任务&#xff0c;它可以识别文本之间的相似性、找到相同或相似的模式&#xff0c;以及进行文本分类和信息检索等应用。本文将深入探讨Python中的字符串…

ssh 远程登录协议

一、SSH 服务 1.1 SSH 基础 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令&#xff0c;SSH 为建立在应…

坚持刷题|翻转二叉树

坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天先刷个简单的&#xff1a;翻转二叉树 题目 226.翻转二叉树 考察点 翻转二叉树又称为镜像二叉树&#xff0c;使用Java实现翻转二叉树通常是为了考察对二叉树的基本操作和递归的理解能力 递归的理解&#xff1a; 能够理解…

vue前端开发自学基础,动态切换组件的显示

vue前端开发自学基础,动态切换组件的显示&#xff01;这个是需要借助于&#xff0c;一个官方提供的标签&#xff0c;名字叫【Component】-[代码demo:<component :is"ComponetShow"></component>]。 下面看看代码详情。 <template><h3>动态…

opencv多张图片实现全景拼接

最近camera项目需要用到全景拼接&#xff0c;故此查阅大量资料&#xff0c;终于将此功能应用在实际项目上&#xff0c;下面总结一下此过程中遇到的一些问题及解决方式&#xff0c;同时也会将源码附在结尾处&#xff0c;供大家参考&#xff0c;本文采用的opencv版本为3.4.12。 首…

Qt/QML编程学习之心得:小键盘keyboard(36)

小键盘对于qml应用是经常用到的,在qml里面,就如一个fileDialog也要自己画一样,小键盘keyboard也是要自己画的,对于相应的每个按键的clicked都要一一实现的。 这里有一个示例: 代码如下: import QtQuick 2.5 import QtQuick.Controls 1.4 import QtQuick.Window 2.0 im…

文件夹名称大小写转换的方法:提高文件管理效率的关键

在计算机的文件管理中&#xff0c;文件夹名称的大小写是经常被忽视的一个细节。这个看似微不足道的细节&#xff0c;却可能影响到文件管理效率和查找速度。下面一起来看云炫文件管理器如何批量修改文件夹名称大小写转换的方法&#xff0c;提高文件管理效率。 文件夹名称字母大…

使用swift创建第一个ios程序

一、安装xcode 先到app store中下载一个Xcode app 二、创建项目 1、项目设定 创建ios app 2、工程结构 三、修改代码实现按键联动 四、运行测试