来吧这个怀疑人生的Lab
网课时代依旧是熟悉的感觉,扑面而来…
看书看的挺好的,题也做的挺好的,奈何你CMU还是你CMU
下章结束就要期中考了呀,加油~?
主要任务就是写一个Shell~
其实蛮友好的,因为书上第八章都有答案,只要结合其缺点加上SIGNAL即可,但是没有大佬们的教程真的难理解逻辑…
需要实现的函数:
Eval
这个函数需要做的就是解析输入的Shell命令行
需要实现:
1.判断前后台
2.判断是否built-in command
3.对前后台、built-in command分别运行
不会写对吧…先打开书翻到P525把它抄进去…(太卑微了QAQ
大概也就实现了,来康康他的问题:
其实就是不回收子进程
为了改掉这个问题,我们引入了一个job list,它维护当前运行的job,实验已经内置addjob,deletejob等函数来辅助
基于书上的讨论,在修改joblist时需要防止子进程在父进程addjob之前就结束,所以add的时候要记得阻塞所有信号喔
可以先用书上的waitpid,因为我们自己的waitfg还没写呢(要记住改!不然等下会很惨…
上代码:
builtin_cmd
这个就是在eval循环里解析的函数
如果是builtin command,就直接执行
如果不是,就要创建子进程去执行啦
不会写对吧…再次打开书翻到P525把下面的抄进去…
(卑微就卑微叭…
然后就拥有了两个内置命令呢!按同样的格式写其他需要实现的
上代码:
do_bgfg
好了这个我基本不知道在干什么的,好像也没得抄(手动微笑
其实是为了fg/bg命令准备的,他的作用是把后台搬到前台或者前台搬到后台
atoi()函数是把字符串转换成整型的
waitfg
好的吧,这个很自然的想到P546的sigsuspend
但是这个不知道为什么…他就是跑不了55555
所以只能卑微的使用初阶形式~
没错上面就是写废的sigsuspend
没毛病,能跑就行(不是
sigchld_handler
众所周知,一个子进程结束会给kernel发SIGCHLD
我们希望改变其接收的默认handler,需要实现输出
有抄的,P542
不说了,都在图里:
sigint_handler/sigtstp_handler
和上面一样的,用于我们测试文件发送的INT
kernel收到之后执行这个handler,然后它会杀死所有的子进程
这些子进程就在上一个task的waitpid里被识别出并回收
这几行极度舒适:
好了以下是小白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里加了信号阻塞(下图注释
去掉就可以了,难道是不能收到信号了?
总之,现在华丽丽可以运行了!
感谢大佬的帮助:
https://zhuanlan.zhihu.com/p/119034923
https://blog.csdn.net/xiaolian_hust/article/details/80087376
https://www.jianshu.com/p/7f5e78e83a0e
这学期依旧在为lab烦恼,其实早就习惯了吧
理论知识学的再顺,也抵不过上手编程遇到的各种问题
ICS最大的收获也就在这里,期末时回头看看,什么稀奇古怪的问题都遇到过,但最后每个lab也都按时上交了
或许以后再也不会写同类型的代码,但总觉得挺不容易的
每天都挺不容易的,满足感就来的很容易啊~
钉钉时代,和以前有什么不一样呢?
作业似乎差不多,只是听课时间短了,也不知道大家的进度,考试还是要考,该啃的还是要一点点啃下来
但是更需要安抚好自己的心情,需要保持自律的态度
其实有挺多等待的、烦恼的、不安的事情
希望在这个春天,能看到多一点转机和坚持的意义
带着一点迷糊挫败,一点信心和勇气,冲下去吧~