mybash的实现
任务详情
- 使用fork,exec,wait实现mybash
- 写出伪代码,产品代码和测试代码
相关知识
shellshell俗称壳,它是一个命令解析器,是用户和Linux内核之间的接口程序。- 在Linux系统中,用户可以通过
shell输入命令,shell通过计算机中的的一些程序,将命令转换成计算机懂的语言,让计算机执行某种程序。
bash- 我们可以把
shell比作是浏览器,而bash是谷歌浏览器 - Linux有各种各样的
shell,bash就是其中最为通用的一种 bash有很灵活和强大的编程接口,同时又有很友好的用户界面- 更多的关于
bash部分我在网上查找了很多资料:
- 我们可以把
- 实现
Mybash- 使用
man bash查看

- 查阅资料我们可知通常
shell中执行命令的流程都是bash进程创建了一个子进程,然后子进程进程替换,替换为可执行的命令文件。 fork:- 这个英文单词在英文里是"分叉"意思,它通过系统调用创建一个与原来进程几乎完全相同的进程,一个是子进程,一个是父进程。
- 在子进程中,
fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。 - 可以通过
fork返回的值来判断当前进程是子进程还是父进程。
exec:- 是一组函数的统称,参数可以分成3个部分:执行文件部分、命令参数部分、环境变量部分
exec函数会取代执行它的进程, 也就是说, 一旦exec函数执行成功, 它就不会返回了, 进程结束. 但是如果exec函数执行失败, 它会返回失败的信息, 而且进程继续执行后面的代码- 通常
exec会放在fork()函数的子进程部分, 来替代子进程执行啦, 执行成功后子程序就会消失, 但是执行失败的话, 必须用exit()函数来让子进程退出
wait:- 父进程调用wait函数可以回收子进程终止信息
pid_t wait(int *status): 成功:清理掉的子进程ID;失败:-1 (没有子进程)
- 使用
伪代码
while(1)
{
输出用户的ID,等数据;
用户输入命令;
创建子进程;
执行命令;
等待命令执行结束;
}
代码实现
运行截图
- 测试:
ls、pwd 
遇到问题及解决方法
- 在进行编译时出现

解决办法:查阅后发现少了两个头文件:
pwd.h和sys/wait.h,程序中需要输出用户的虚拟机的用户ID等数据,就需要口令文件pwd.h,在开始就调用进程需要进程控制文件sys/wait.h来提供类型pid_t的定义。
浙公网安备 33010602011771号