CSAPP:shlab

来吧这个怀疑人生的Lab
网课时代依旧是熟悉的感觉,扑面而来…
看书看的挺好的,题也做的挺好的,奈何你CMU还是你CMU
下章结束就要期中考了呀,加油~


主要任务就是写一个Shell~
其实蛮友好的,因为书上第八章都有答案,只要结合其缺点加上SIGNAL即可,但是没有大佬们的教程真的难理解逻辑…
需要实现的函数:
CSAPP:shlab_第1张图片


Eval

这个函数需要做的就是解析输入的Shell命令行
需要实现:
1.判断前后台
2.判断是否built-in command
3.对前后台、built-in command分别运行

不会写对吧…先打开书翻到P525把它抄进去…(太卑微了QAQ
大概也就实现了,来康康他的问题:
其实就是不回收子进程
为了改掉这个问题,我们引入了一个job list,它维护当前运行的job,实验已经内置addjob,deletejob等函数来辅助
基于书上的讨论,在修改joblist时需要防止子进程在父进程addjob之前就结束,所以add的时候要记得阻塞所有信号

可以先用书上的waitpid,因为我们自己的waitfg还没写呢(要记住改!不然等下会很惨…

上代码:CSAPP:shlab_第2张图片
CSAPP:shlab_第3张图片


builtin_cmd

这个就是在eval循环里解析的函数
如果是builtin command,就直接执行
如果不是,就要创建子进程去执行啦
不会写对吧…再次打开书翻到P525把下面的抄进去…
(卑微就卑微叭…
然后就拥有了两个内置命令呢!按同样的格式写其他需要实现的
上代码:
CSAPP:shlab_第4张图片


do_bgfg

好了这个我基本不知道在干什么的,好像也没得抄(手动微笑
其实是为了fg/bg命令准备的,他的作用是把后台搬到前台或者前台搬到后台
CSAPP:shlab_第5张图片
CSAPP:shlab_第6张图片
atoi()函数是把字符串转换成整型的


waitfg

好的吧,这个很自然的想到P546的sigsuspend
但是这个不知道为什么…他就是跑不了55555
所以只能卑微的使用初阶形式~
CSAPP:shlab_第7张图片
没错上面就是写废的sigsuspend
没毛病,能跑就行(不是


sigchld_handler

众所周知,一个子进程结束会给kernel发SIGCHLD
我们希望改变其接收的默认handler,需要实现输出
有抄的,P542

不说了,都在图里:
CSAPP:shlab_第8张图片


sigint_handler/sigtstp_handler

和上面一样的,用于我们测试文件发送的INT
kernel收到之后执行这个handler,然后它会杀死所有的子进程
这些子进程就在上一个task的waitpid里被识别出并回收
这几行极度舒适:
CSAPP:shlab_第9张图片


好了以下是小白ssfd的TEST中debug之旅:

1.加入/bin/echo到job list

这个蛮困扰的,好像是eval里没配置好

2.收不到INT信号

似乎是eval里忘记解开BLOCK了…dbq真的太菜了

3.sigchld_handler里的waitpid总返回-1

这个十分的有趣啊,就是因为eval里仍然留着waitpid…没改
第一次就已经waitpid过了,第二次怎么可能收到pid的…

4.test10/13/14卡在fg %1

这个是今天最后搞定的,发现是因为我在do_bgfg里加了信号阻塞(下图注释CSAPP:shlab_第10张图片
去掉就可以了,难道是不能收到信号了?

总之,现在华丽丽可以运行了!


感谢大佬的帮助:
https://zhuanlan.zhihu.com/p/119034923
https://blog.csdn.net/xiaolian_hust/article/details/80087376
https://www.jianshu.com/p/7f5e78e83a0e

这学期依旧在为lab烦恼,其实早就习惯了吧
理论知识学的再顺,也抵不过上手编程遇到的各种问题
ICS最大的收获也就在这里,期末时回头看看,什么稀奇古怪的问题都遇到过,但最后每个lab也都按时上交了
或许以后再也不会写同类型的代码,但总觉得挺不容易的
每天都挺不容易的,满足感就来的很容易啊~

钉钉时代,和以前有什么不一样呢?
作业似乎差不多,只是听课时间短了,也不知道大家的进度,考试还是要考,该啃的还是要一点点啃下来
但是更需要安抚好自己的心情,需要保持自律的态度
其实有挺多等待的、烦恼的、不安的事情
希望在这个春天,能看到多一点转机和坚持的意义
带着一点迷糊挫败,一点信心和勇气,冲下去吧~

你可能感兴趣的:(CSAPP:shlab)