CSAPP: Shell Lab

本文详细介绍了Shell Lab实验,重点讲解了eval()、builtin_cmd、do_bgfg、waitfg、sigchld_handler、sigint_handler和sigtstp_handler等关键函数的实现,探讨了如何处理进程控制、信号管理和32位程序在64位系统上的执行问题。
摘要由CSDN通过智能技术生成

介绍

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值