前言
对应书本第八章内容。
通过写一个简单的Unix shell program,来熟悉程序控制以及信号处理。
本机使用win10 +wsl2.0 + ubuntu18.04完成实验。
reference
命令
- 运行my shell
sudo make
./tsh
任务
该实验在tsh.c
文件中实现了大部分的框架,需要自己完成以下函数内容:
eval
:解析和解释命令行的主例程,大约70行。builtin_cmd
:识别并解释内置命令:quit
、fg
、bg
和jobs
,大约25行。waitfg
:等待前台作业完成do bgfg
bg and fg built-in commands的实现sigchld_handler
:SIGCHLD
信号的处理函数sigint_handler
:SIGINT
信号的处理函数sigtstp_handler
:SIGTSTP
信号的处理函数
要求
- 提示应为字符串
tsh>
- 用户键入的命令行应包含一个名称和零个或多个参数,所有参数均由一个或多个空格分隔。 如果名称是内置命令,则shell应该立即处理它并等待下一个命令行。 否则,shell应该假定名称是可执行文件的路径,它在初始子进程的上下文中加载并运行。
- shell不需要支持管道
|
或I/O重定向<
和>
- 键入
ctrl-c
(ctrl-z
)应该会导致SIGINT
(SIGTSTP
)信号发送到当前前台作业以及该作业的任何后代,如果没有前台作业,那么信号应该没有效果。 - 如果命令行以
&
结束,则shell应该在后台运行作业,否则它将在前台运行该作业。 - 每个作业都可以通过进程ID(PID)或作业ID(JID)进行标识,该ID是tsh分配的正整数。
- shell需要支持以下内置命令:
quit
、jobs
、bg <job>
和fg <job>
。 - shell应该回收所有僵死子进程,如果任何作业由于接收到未捕获到的信号而终止,则shell应该识别此事件并打印一条消息,其中包含该作业的PID和有问题的信号的描述。
评估
共有16个trace文件。依次过关。
可以通过对比看出是否完成任务:
make test01
make rtest01
内容
未完成。
看了两遍书,没有做下去的动力。因为没有碰到这个需求。
需要的时候会回头的。
代码是copy完善的。