介绍
shell Lab的主要目的是为了让我们熟悉进程控制和信号。
实验准备
下载shell Lab实验包:原实验包github链接,本文中撰写的tsh.c全部代码github链接
【实验内容】
是对tsh.c中没有填写的函数进行填写,使得该shell能处理前后台运行程序、能够处理ctrl+z、ctrl+c等信号。
需要实现的函数主要有一下五个:
eval: 主要功能是解析cmdline,并且运行. [70 lines]
builtin cmd: 辨识和解析出bulidin命令: quit, fg, bg, and jobs. [25lines]
do bgfg: 实现bg和fg命令. [50 lines]
waitfg: 实现等待前台程序运行结束. [20 lines]
sigchld handler: 响应SIGCHLD. 80 lines]
sigint handler: 响应 SIGINT (ctrl-c) 信号. [15 lines]
sigtstp handler: 响应 SIGTSTP (ctrl-z) 幸好. [15 lines]
【实验结果的检验】
通过运行./tshref
这个已经实现的shell将它的输出结果与我们自己实现的shell的结果进行比较
【注意】
有必要阅读《深入理解计算机系统 第二版》第8章异常控制流的所有内容。对于以下内容有比较好的了解
- 实验中重要的函数:
void sigemptyset(sigset_t *mask);
void Sigaddset(sigset_t *mask,int sign);
void Sigprocmask(int how,sigset_t *mask,sigset_t *oldmask);
pid_t Fork(void);
void Execve(char *filename,char *argv[],char *envp[]);
void Setpgid(pid_t pid,pid_t gpid);
void Kill(pid_t pid,int sig);
实验中最重要的eval()函数的原型可以在P503找到。
实验中期望运用GDB来调试程序,然而当初次调试时发现里面并不包含符号表等为调试提供方便的内容。可以通过修改
makefile
来改变这一情况,修改makefile
文件中的CFLAGS
字段,添加-g
参数(为函数编译时添加必要的调试信息)。其中本来就存在的-02
参数代表程序需要优化的级别,对于优化过的程序我们调试起来可能有些困惑,所以推荐移除,当然不移除问题不大。
在linux 64位机器上执行
.tshref
程序会有如下可能输出
unix > ./tshref: No such file or directory
file ./tshref文件可以看到是32位程序
通过sudo apt-get install ia32-libs
解决该问题
实验
tsh.c的完整代码在github tsh.c链接
下面实现用用到的系统函数首字母为大写如Fock(),是我自己定义的错误分装函数,提高代码的简洁性。
/*error-handling wrapper funtion -by yzf*/
void Sigemptyset(sigset_t *mask);
void Sigaddset(sigset_t *mask,int sign);
void Sigprocmask(int how,sigset_t *mask,sig