LAB7
0x00扯淡
首先,感觉CSAPP的实验蛮好玩的,有助于我理解书上的知识,而且写一个shell应该蛮有意思的,所以还是把这试验也做了。(事实一点都不有趣!)
这个实验内容是实现一个unix下的简易shell, 需要实现的功能包括bg, fg等作业控制命令, 还需要实现ctrl-c, ctrl-z等信息的处理,由于实现这个shell需要进行多进程的编程,这是第一次进行多进程编程,用GDB调试的时候比较不熟练,问题也是稀奇古怪的。
最后搞了几天终于是把程序都调好了,16个测试文件前15个都能通过,第16不知道怎么测试,说是不从终端接收信号,要从别的进程接收信号,不知道怎么搞。
0x01基础说明
这次实验我们主要要修改的文件是tsh.c的文件。
这里先说明下,外面某些文件的作用。
myint.c实现睡眠函数功能,命令myint<n> 表示让程序睡眠n秒
myspin.c: 实现的也是睡眠函数功能,命令myspin <n>表示让程序睡眠n秒,与myint.c的区别在于这个函数睡眠好后就自动退出了,没有检测系统错误。从下面的代码可以看出:
myint.c
myspin.c
mysplit.c 这个函数也是实现睡眠功能,但是它是创建一个子进程进行睡眠,然后父进程等待子进程正常睡眠N秒后,继续运行。
具体可参照代码:
mystop.c:让进程暂停几秒,并发送信号
sdriver.pl:是一个perl脚本,具体的作用应该是用来测试整个shell的
接下来,讲讲TSH.C文件里的东西。
一开始,要求把名字和编号写进去。我写了学号和我的小名。
这个文件,主要要修改下面几个函数。
函数作用:
eval: Main routinethat parses and interprets the command line. [70 lines]
• builtin cmd:Recognizes and interprets the built-in commands: quit, fg, bg,and jobs. [25
lines]
• do bgfg:Implements the bg and fg built-incommands. [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. [15lines]
• sigtstp handler:Catches SIGTSTP (ctrl-z) signals. [15lines]
通俗的讲,(具体可看tsh.c说明文件,里面基本都一一注释了,包括一些系统本身提供的代码)
补充:
这里面多次调用了kill函数。这里说明下kill函数:
表头文件 #include<sys/types.h>
#include<signal.h>
定义函数 int kill(pid_t pid,int sig);
函数说明
kill()可以用来送参数sig指定的信号给参数pid指定的进程。参数
pid有几种情况:
pid>0 将信号传给进程识别码为pid 的进程。
pid=0 将信号传给和目前进程相同进程组的所有进程
pid=-1 将信号广播传送给系统内所有的进程
pid<0 将信号传给进程组识别码为pid绝对值的所有进程
0x02代码详解
这里详见,代码说明文件tsh.c
0x03测试解析
测试前,先要使用make命令,make各种文件(不仅仅包括测试文件)
tsh测试
可以调用系统命令
可以调用内置命令
test1:
源文件:
#
# trace01.txt - Properly terminate on EOF.
#
CLOSE
WAIT
测试结果:
测试分析:
它正确读出文件中数据,然后在读取close的时候,关闭文件,并等待(wait感觉测不出来,貌似直接关闭了,我后来加了很多wait也是一样)
test2:
源文件:
#