CS:APP3e 深入理解计算机系统_3e ShellLab(tsh)实验

 详细的题目要求和资源可以到 http://csapp.cs.cmu.edu/3e/labs.html 或者 http://www.cs.cmu.edu/~./213/schedule.html 获取。

 

完整代码:https://paste.ubuntu.com/26257776/

 

前期准备

 

注意事项

  • tsh的提示符为“tsh> ”
  • 用户的输入分为第一个的name和后面的参数,之间以一个或多个空格隔开。如果name是一个tsh内置的命令,那么tsh应该马上处理这个命令然后等待下一个输入。否则,tsh应该假设name是一个路径上的可执行文件,并在一个子进程中运行这个文件(这也称为一个工作、job)
  • tsh不需要支持管道和重定向
  • 如果用户输入ctrl-c (ctrl-z),那么SIGINT (SIGTSTP)信号应该被送给每一个在前台进程组中的进程,如果没有进程,那么这两个信号应该不起作用。
  • 如果一个命令以“&”结尾,那么tsh应该将它们放在后台运行,否则就放在前台运行(并等待它的结束)
  • 每一个工作(job)都有一个正整数PID或者job ID(JID)。JID通过"%"前缀标识符表示,例如,“%5”表示JID为5的工作,而“5”代笔PID为5的进程。
  • tsh应该有如下内置命令:
quit: 退出当前shell  jobs: 列出所有后台运行的工作  bg <job>: 这个命令将会向<job>代表的工作发送SIGCONT信号并放在后台运行,<job>可以是一个PID也可以是一个JID。  fg <job>: 这个命令会向<job>代表的工作发送SIGCONT信号并放在前台运行,<job>可以是一个PID也可以是一个JID。
  • tsh应该回收(reap)所有僵尸孩子,如果一个工作是因为收到了一个它没有捕获的(没有按照信号处理函数)而终止的,那么tsh应该输出这个工作的PID和这个信号的相关描述。

 

提示

  • 利用测试文件逐步构建tsh,例如先从trace01.txt开始。
  • setpgid中的WUNTRACED and WNOHANG选项有用(参看前期准备)
  • 当解析命令并产生子进程的时候(fork )的时候,必须先调用sigprocmask block SIGCHLD信号,调用addjob将刚刚创建的工作加入到工作列表里,然后unblock该信号(课件里有讲这个竞争产生的问题)。另外,由于子进程会继承block的特性,所以子进程要记得unblock。
  • 一些具有终端环境的进程会尝试从父进程读写数据,例如/bin/sh,还有一些程序例如more less vi emacs 会对终端做一些“奇怪的设置”。本次实验用/bin/ls /bin/echo这样的文字模式的程序测试即可。
  • 当我们在真正的shell(例如bash)中执行tsh时,tsh本身也是被放在前台进程组中的,它的子进程也会在前台进程组中,例如下图所示:

                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信


和一个专注代码17年的团队,一起学习,踏实的成长,朴素、真挚的面对世界

万码学堂课程咨询电话0532-85025005

鲁ICP备09077726号-5