全部学习汇总: GitHub - GreyZhang/g_unix: some basic learning about unix operating system.
继续分析之前看到的一段代码,先梳理一下这里遇到的fork函数的应用。
1. 这个是属于系统调用类的接口,也是这一段时间我看到的第一个这种类型的接口。主要的功能就是创建一个子进程。
2. 子进程的创建方式是通过复制调用它的进程来创建的,而父子进程的存储空间是独立的,子进程会有自己的PID、进程组编号以及会话。看到这里,感觉这几个概念后续还是得有一定的理解才行。
3. 有一些信息子进程是不会继承父进程的,例如进程内存锁、继承资源利用率、CPU时间计数器、信号量调整、记录锁、定时器。
1. 子进程也不会继承未处理的异步IO操作和任何异步IO上下文。
2. 关于细节性的信息这里给出来了太多,单纯的强行记忆没有什么很好的作用,这里的信息我决定先跳过去后续随着实际的应用来返回查找认证。
1. 如果操作成功,那么父进程返回子进程的PID(标注的时候写错了),自己成返回0,而失败则返回1。这里让我觉得有点不适应,因为之前看到的接口大部分时候返回0代表成功调用。因此,从这种角度上考虑我倒觉得如果父进程调用成功应该返回0比较符合。不过,既然已经是一个标准化的设计,还得去适应一下。
2. 这里提到了一些错误相关的信息,之前见得比较多的数目限制(一个用户ID允许的数目)以及内存不足等在这里都有。
3. 这个接口符合多个POSIX、SVr4以及4.3BSD标准,也应该如此。之前看丹尼斯·里奇报告文档的时候看到过这个fork的理念其实是来自于之前的火星计划,后来被UNIX借鉴。因此,这个接口设计的考虑应该有着浓浓的UNIX风格。
4. glibc中也有这个接口,但是在2.3.3之后的版本glibc中的这个接口就等同于clone,不再是对内核功能的调用了。
看了上面的基础资料之后,这个函数的设计其实就很容易理解了。在功能上,其实这个函数基本上等同于fork本身,但是多了一个失败后的系统调用错误打印提示。
再回到主函数部分分析这个shell的主要功能,跳过cd的处理之后可以知道,这个函数的循环其实是完成了一个命令获取成功之后的fork。Fork的结果会让子进程去判断传入的命令,之后运行命令。不过,这个判断以及运行的具体机制看起来得靠后续的分析来了解了。