shelllab笔记

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中终止或者停止的子进程的退出状态。

(4)每fork一个子进程,执行setgpid(0, 0),方便BG,FG管理。

(5)sigint_handler和sigtstp_handler中只用kill发送信号,sigchld_handler回收时再进行后续输出与处理,这样主要是使子进 程真正终止或退出后再进行处理,并且将处理逻辑都放到sigchld_handler中。

(6)用信号阻塞消除addjob和deletejob之间的竞争,在addjob前阻塞父进程的SIGCHLD信号,这个书上写的比较详细。

完整代码参考:

http://www.cnblogs.com/he11o-liu/p/7503221.html


猜你喜欢

转载自blog.csdn.net/bysoulwarden/article/details/80654537
今日推荐