图2 进程控制系统调用-fork_wait
2.1.3
Mini Shell编程(此部分操作截图见图4、5)
1. 在exp2目录编写一个简单的shell程序—Mini Shell,它接收输入的命令并解释执行。
? Linux的命令分为内部命令和外部命令两种。内部命令由Shell程序自己实现,如cd、
pwd等,外部命令是位于磁盘上(多数在/bin和/usr/bin目录下)的可执行程序。Mini Shell只实现两个内部命令:pwd和quit(退出),它可执行所有不带选项和参数的外部命令,如date、who、cal、ls等。
2. (选做1)修改Mini Shell程序,使它可执行只带一个命令选项或参数的命令行,如ls -a、
cat file、echo hello等。
? 用strtok函数将读入的命令行cmd以空格为分隔符拆为两个字符串cmd1和cmd2: cmd1=strtok(cmd,\ cmd2=strtok(NULL,\
此时的cmd1即为命令名,cmd2即为命令的选项或参数。判断cmd2,若为空则执行系统调用execlp(cmd1, cmd1, NULL),否则执行execlp(cmd1, cmd1, cmd2, NULL)
3. (选做2)修改Mini Shell程序,可做任何你认为可以改进的修改,如界面、提示、处理输
入错误、增强功能等。
图4 Mini Shell编程-1
图5 Mini Shell-2
图6 Mini Shell-3
3. 实验结论与评价
3.1 进程控制命令
此部分操作较为简单,主要在帮助理解进程的概念和进程的PID,掌握基本的进程操作如ps kill和后台运行一个程序等。通过这一部分的操作我了解到进程是什么,进程和程序有什么不一样,子进程和父进程之间的关系。
3.2 进程控制系统调用
fork_wait是本次实验的第一个编程题,通过已经给好的代码我了解到了几个在Linux中常用的函数,如sleep(), getpid(), fork(), wait() 等,我更加清晰地在修改程序的过程中理解了子进程和父进程的关系,更重要的是我学会了通过简单函数来对进程进行控制。观察到了特殊的僵尸进程:僵尸进程(zombie)是指已终止运行,但尚未被清除的进程。
exec_test是本次试验的第二个编程题,这次学习到的函数是execl(),第一参数path字符指针所指向要执行的文件路径, 接下来的参数代表执行该文件时传递的参数列表:argv[0],argv[1]... 最后一个参数用空指针NULL作结束。利用这个函数实现了用exec()置换程序的执行代码文件的功能。
3.3 Mini Shell编程
这一部分的操作较为复杂,占用了实验的大部分时间。让我意识到我们的编程能力还有待提高,尤其是字符串、文件等部分。选作一的地方通过空格把命令名和参数分开分别执行,需要分清是应该先读命令再分开还是先分开再读命令,选作二我增添了几个Mini Shell内部命令,修改了界面。
4. 程序清单
4.1 fork_wait.c
#include
int rid, cid;
printf(\2012010948****\\n\ //将your-sid改为你的学号 rid = fork();
if ( rid < 0 ) printf(\ else if ( rid == 0 ) { // 子进程
printf(\ sleep(10); // 睡眠10秒 printf(\ }
else { // 父进程
//sleep(30); //睡眠30秒 cid=wait(NULL);
printf(\ } exit(0); } }
4.2 exec_test.c
#include
printf(\2012010948****\\n\ //将your-sid改为你的学号 rid = fork();
if ( rid < 0 ) printf(\ else if ( rid == 0 ) { // 子进程
printf(\ execl(\ }