好吧,回到正题。这个lab一开始是不打算写了,找复旦软院的同学借了一份代码,本来是真的打算就这样交上去算了,后来想了想,不写很虚,期末考试万一跪了就GG了。于是又认认真真地做了这个lab。总体来说难度不是很大,比之前的malloc和processor要简单得多。
测试出来的结果就是这样~
shell,我理解就是类似于ubuntu的terminal的东西,ICS给的PDF上的解释是:shell是运行在代表用户程序的交互式命令行解释器。一个shell,重复操作打印的提示,等待标准输入上一命令行,然后执行一些动作,所指示的命令行的内容。
这个lab的要求是:如果是内置的命令,那么就直接执行,如果不是的话,那就fork一个子进程,然后在子进程中执行命令。其他一些琐碎的要求就不说了,接下来就说说我的做法吧。
首先看看都需要改啥函数吧,eval函数用来判断输入的命令行,如果是内置的命令那就调用builtin_cmd,直接处理,如果不是的话,那就fork进程,在子进程里处理,在父进程里要把子进程加到jobs表里。这里比较需要注意的是要在fork前要把cld信号锁起来,主要是怕还没有把子进程加到jobs里,就调用childhandler,试图把还没加到jobs的进程删掉。
builtin_cmd就是处理内置命令,没啥,do_fgbg也没啥,就是根据输入处理下就好,需要注意的是kill函数的进程要是原本的pid的负数,不知道为何要这样。waitfg要做的就是等,等到要等的进程不再是前台的进程。waitfg比较难,主要是bug多。。。。
接下来,就是几个handler了。childHandler也是不好写,是对于结束的子进程做回收处理(无论是怎么结束的)至于stp和int的处理,就是kill(-pid,SIGINT);就可以了,不是问题。
至于代码,在这里,http://download.youkuaiyun.com/detail/u011450272/6725763
之所以这么贵倒不是我想挣硬币- -解释已经在下载页面了。如果是我交的学弟学妹,那万万不要下载下来就交了,起码改改,因为我的代码都给一个小学弟了,你们要是被判cheating那可不能怪我0 0