2017-2018-1 20155338 《信息安全系统设计基础》第5周加分项Mybash的实现

使用fork,exec,wait实现mybash

一、fork函数

定义和理解:fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。

fork函数的特性

fork函数可能仅仅被调用一次,但却有可能返回两次,甚至有可能有三种不同的返回值:

1)在父进程中,fork返回新创建子进程的进程ID;

2)在子进程中,fork返回0;

3)如果出现错误,fork返回一个负值;

2017-2018-1 20155338 《信息安全系统设计基础》第5周加分项Mybash的实现-LMLPHP

gdb调试fork

2017-2018-1 20155338 《信息安全系统设计基础》第5周加分项Mybash的实现-LMLPHP

exec函数

1、进程控制的exec函数:当用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。

2、因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段。

3、用fork可以创建新进程,用exec可以执行新程序。
2017-2018-1 20155338 《信息安全系统设计基础》第5周加分项Mybash的实现-LMLPHP

wait函数

函数的作用:编程过程中,有时需要让一个进程等待另一个进程,最常见的是父进程等待自己的子进程,或者父进程回收自己的子进程资源包括僵尸进程,这时候可以用wait函数。

函数功能

父进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。

2017-2018-1 20155338 《信息安全系统设计基础》第5周加分项Mybash的实现-LMLPHP

myshell

2017-2018-1 20155338 《信息安全系统设计基础》第5周加分项Mybash的实现-LMLPHP

代码托管

05-12 10:32