CSAPP LAB---shlab-handout

本文档详细介绍了实现一个Unix下简易shell的实验过程,包括功能需求如作业控制命令(bg, fg)和信号处理(ctrl-c, ctrl-z)。通过16个测试文件,前15个已成功通过,最后一个测试涉及从非终端进程接收信号,尚未解决。主要修改的代码文件为tsh.c,涉及到的函数包括eval、builtin cmd、do bgfg、waitfg等。实验过程中使用GDB调试多进程代码,遇到各种问题,最终完成大部分功能。" 107153435,8768333,"Perl/Tk高级小部件:Tk::NoteBook, Tk::ProgressBar与更多
摘要由CSDN通过智能技术生成

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:

源文件:

#

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值