shlab的目的是完成几个函数,实现一个简单的shell。
需要实现的函数如下:
• eval: Main routine that parses and interprets the command line. [70 lines]
• builtin_cmd: Recognizes and interprets the built-in commands: quit, fg, bg, and jobs. [25lines]
• do_bgfg: Implements the bg and fg built-in commands. [50 lines]
• waitfg: Waits for a foreground job to complete. [20 lines]
• sigchld_handler: Catches SIGCHILD signals. 80 lines]
• sigint_handler: Catches SIGINT (ctrl-c) signals. [15 lines]
• sigtstp_handler: Catches SIGTSTP (ctrl-z) signals. [15 lines]
本次实验需要对进程控制及信号有比较完善的理解,并且需要注意很多细节。因为是看完书半年多才回头做这个实验,加上原本对这块没有很好的理解,很多细节没注意到,所以整个过程比较困难,体验比较差,很难受。
需要注意的细节如下:
(1)对于等待一个子进程停止或终止时,waitpid不要在eval和sigchld_handler中重复使用,因为其对于一个子进程只能捕获一次,如果前台的子进程终止时,后台还有进程运行,主进程会在sigchld_handler中挂起,等待后台进程结束。此时所以在eval使用pause()或sleep(sec)。
(2)注意waitpid中的参数,WNOHANG立即返回,检测子进程终止;WUNTRACED挂起,检测子进程终止或停止;WUNTRACED|WNOHANG立即返回,检测子进程终止或停止。
(3)用WIFEXITED(status),WIFSIGNALED(status),WIFSTOPPED(status)等来获得waitpid中终止或者停止的子进程的退出状态。
完整代码参考:
http://www.cnblogs.com/he11o-liu/p/7503221.html