(三)Ctrl+Z后卡死??
进一步的测试我发现ctrl+z发送暂停信号给子进程后Shell进入了暂停状态,
子进程进入暂停状态,父进程也暂停了,我发现暂停是发生在取消信号阻塞的时候,我猜想是由于子进程暂停的时候发送了父进程但是没有处理而发生了阻塞,于是我试着在SIGCHLD处理函数中的waitpid将option添加WUNTRACED去接受子进程暂停的信号并处理。问题解决了。
虽然解决了,但我始终不太清楚,直到我在这篇博客中看到了答案,感谢。总是的来说就是SIGCHLD会在子进程terminate,interruputed,or resumes after being interruputerd 的时候发送。
Printf无输出问题
在实验过程中我还碰到了printf无输出问题,这个问题的存在是因为printf的缓存机制,这里我引用在CSDN论坛看到一个很清晰的回答
unix上标准输入输出都是带有缓存的,一般是行缓存。对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。ANSI C中定义换行符’\n’可以认为是行刷新标志。所以,printf函数没有带’\n’是不会自动刷新输出流,直至缓存被填满。
总结:
1.其实这次的shell lab不能算是完全撸一个shell,因为大体的框架已经写好了,只能说实现一个大体的功能,因此在熟悉了进程之间的信号通信后完成起来不算太困难。
2.大部分的API以及Signal 的标准还是需要从manual中才能准确答案,有时候一些细坑真的就是来自于manual的一小行。