HNU计算机系统实验shlab5&shlab6

此为本人在进行实验时所做的实验日志,仅供参考。

1、比较trace06执行不同结果,编程实现sigint_handler捕获INT响应、waitfg()等待、sigchld_handler回收僵死:
首先在之前实验的基础上执行trace06比较不同,得到结果如下:
在这里插入图片描述
在这里插入图片描述
可以看到少了一条指令,之前的myspin都可以正常执行,于是查看trace06文件:
在这里插入图片描述
可以看到就是最后一条INT指令没有执行,说明在函数中缺少了可以处理INT的分支。于是将代码修改如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如此程序就可以对INT指令做出反应。具体如下:
在sigint_handler函数中执行接收信号,通过kill(-pid,SIGINT)发送信号给指定进程,函数原型为kill(pid,信号类型),如果pid为负的说明给该进程组的所有进程发送信息。
在waitfg函数回收僵尸进程,使用在sigchld_handler中。
在sigchld_handler函数中回收僵死,用while循环来避免信号阻塞的问题,为了回收所有的僵尸进程。
最终实现INT指令。

2、验证trace06~trace07,了解接收信号、信号处理、信号阻塞概念:
接收信号:当内核从一个异常处理程序返回,准备将控制传递给进程p时,它会检查进程p的未被阻塞的待处理信号的集合,如果这个集合为空(通常情况下),那么内核将控制传递到p的逻辑控制流中的下一条指令。如果集合非空,那么内核选择集合中的某个信号k(通常是最小的k),并且强制p接收信号k。收到这个信号会触发进程的某种行为。一旦进程完成了这个行为,那么控制就传递回p的逻辑控制流中的下一条指令。
信号处理:程序对于所捕获的信号进行处理并最后终止。一般会只捕获一个信号并终止,但也有可能会捕获多个信号,那么就可能会出现待处理信号被阻塞、待处理信号不会排队等待、系统调用被中断的问题
信号阻塞:将信号保持在未决状态,直到进程接触对此信号的阻塞,才执行递达动作。与忽略不同,忽略是信号处理(传递)的一种,阻塞直到被解除才能传递动作。信号未决是指从信号产生到递达之间的状态。信号递达是实际信号执行的处理过程,有三种状态(忽略、执行默认动作、捕获)
trace06跟踪文件是先调用myspin函数睡眠4秒,然后再调用SLEEP内置指令睡眠2秒,最后调用INT指令,应该输出job [1] terminated by signal 2
trace07跟踪文件是先在后台调用myspin函数睡眠4秒,再调用myspin函数睡眠5秒,再调用SLEEP内置指令睡眠2秒,再调用INT指令,应该输出job [2] terminated by signal 2,再调用job指令输出所有的后台作业,最终得到的结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到test的结果和rtest的示例结果完全相同,证明实验正确

3、比较trace08执行不同结果,编程实现sigtstp_handler捕获TSTP响应:
首先在之前实验的基础上执行trace08比较不同,得到如下结果:
在这里插入图片描述
在这里插入图片描述
可以看到区别很大,所以考虑查看trace08文件:
在这里插入图片描述
可以看到有一个新的TSTP指令没有执行,直接跳过,导致程序出错。思考结果是在程序中没有对TSTP指令进行捕捉,所以无法进入可以处理TSTP指令的分支,由此将代码进行修改,结果如下:
在这里插入图片描述
可以看到和之前的sigint_handler函数基本一致,只是在kill函数的参数和一些细节上有区别。具体如下:
在sigtstp_handler函数中执行接收信号,通过kill(-pid,SIGINT)发送信号给指定进程,函数原型为kill(pid,信号类型),如果pid为负的说明给该进程组的所有进程发送信息。

4、验证trace08:
trace08跟踪文件是先在后台调用myspin函数睡眠4秒,再调用myspin函数睡眠5秒,再调用SLEEP内置指令睡眠2秒,再调用TSTP指令,应该输出job [2] stopped by signal 2,再调用job指令输出所有的后台作业,最终得到的结果如下:
在这里插入图片描述
在这里插入图片描述
可以看到test的结果和rtest的示例结果完全相同,证明实验正确

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值