实在是不想再继续看大雾了,这讲的都是啥。于是就作死地试着把win7换成了win8.1,问题是真多- -在写这个日志的时候,我的输入法每打一个字,整个chrome就会不响应几秒钟,我整个人都不好了。于是被逼在虚拟机里写,实在是逗。微软不是说这是一个很有诚意的东西么,难道chrome已经不能承受高大上的win8输入法了么fxxk!

代码

我的代码在这里,仅供参考哦

正题

好吧,回到正题。这个lab一开始是不打算写了,找复旦软院的同学借了一份代码,本来是真的打算就这样交上去算了,后来想了想,不写很虚,期末考试万一跪了就GG了。于是又认认真真地做了这个lab。总体来说难度不是很大,比之前的malloc和processor要简单得多。

测试出来的结果就是这样~

Score

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);就可以了,不是问题。

总体而言比较简单。

评论