详细的题目要求和资源可以到 http://csapp.cs.cmu.edu/3e/labs.html 或者 http://www.cs.cmu.edu/~./213/schedule.html 获取。 完整代码:https://paste.ubuntu.com/26257776/ 前期准备
注意事项
name和后面的参数,之间以一个或多个空格隔开。如果name是一个tsh内置的命令,那么tsh应该马上处理这个命令然后等待下一个输入。否则,tsh应该假设name是一个路径上的可执行文件,并在一个子进程中运行这个文件(这也称为一个工作、job)ctrl-c (ctrl-z),那么SIGINT (SIGTSTP)信号应该被送给每一个在前台进程组中的进程,如果没有进程,那么这两个信号应该不起作用。quit: 退出当前shell jobs: 列出所有后台运行的工作 bg <job>: 这个命令将会向<job>代表的工作发送SIGCONT信号并放在后台运行,<job>可以是一个PID也可以是一个JID。 fg <job>: 这个命令会向<job>代表的工作发送SIGCONT信号并放在前台运行,<job>可以是一个PID也可以是一个JID。
提示
setpgid中的WUNTRACED and WNOHANG选项有用(参看前期准备)fork )的时候,必须先调用sigprocmask block SIGCHLD信号,调用addjob将刚刚创建的工作加入到工作列表里,然后unblock该信号(课件里有讲这个竞争产生的问题)。另外,由于子进程会继承block的特性,所以子进程要记得unblock。more less vi emacs 会对终端做一些“奇怪的设置”。本次实验用/bin/ls /bin/echo这样的文字模式的程序测试即可。
