Shell lab
记录一下 shell lab 的求解过程
Shell lab
test09
tshref 的结果显示如下:
明显要求构造 bg 的内部命令 使用 atoi
将字符串转化为数字,但是使用该函数前先要检验
argv[1]是否存在,否则会导致段错误 如果转化失败或者没有该数字对应的 job
或 pid ,就输出相应数字,报告错误
测试时发现,bg 有时会输出两遍,一时没想明白:
经过不断调试发现,最终在发现进程从暂停中恢复时也会向父进程发送信号
sigchild,而有时输出两遍,大概率是信号中断了输出,导致多输出了一遍。
显然解决方案是把 printf 语句移动到信号 continue
发送给子进程之前。可是这样并不能解决问题,因为不能将所有的 printf
都移到发送信号前,例如:
将 shell 的名字输出了两遍。想到一个办法就是在发送信号后,sleep
一会儿,这样就算 sleep 被信号中断也不会发生什么。
注意
当我把 wait 的参数去掉 continue 时,发现这种情况不再发生,不知道为什么。
test10
要求构造 fg 的内部命令。
fg
呢分为把后台进程变为前台,以及暂停的进程变为前台(无所谓之前进程是前台或后台)。
注意调用 waitfg 要处于屏蔽 sigchld
信号状态,否则可能导致子进程结束在调用 waitfg 之前。
两题的代码如下:
1 | void do_bgfg(char **argv) |
后面的 test
能做到这里,前面的应该都实现了吧。