1、为什么要创建子进程
(1)、每一次程序运行都需要一个进程
(2)、多个进程实现宏观上的并行
2、fork的内部原理
(1)、进程的分裂生长模式。
如果操作系统需要一个新进程来运行一个程序,那么操作系统会用一个现有的进程来复制生成一个新的进程。
(2)、fork函数调用一次会返回两次,返回值等于0的就是子进程,而返回值大于0的就是父进程。
(3)、典型的使用fork的方法:使用fork后然后用if判断返回值,并且返回值大于0时就是父进程,等于0时就是子进程。
(4)、fork的返回值在子进程中等于0,在父进程中等于本次fork创建的子进程的进程ID。
3、关于子进程
(1)、子进程有自己独立的PCB
(2)、子进程被内核同等调度
4、父子进程对文件的操作
(1)、子进程继承父进程中打开的文件
a、父进程先open打开一个文件得到fd,然后在fork创建子进程。之后在父子进程中各自write向fd中写入内容
b、测试结论:接续写。实际上本质原因是父子进程之间的fd对应的文件指针是彼此关联的(特别像O_APPEND标志后的样子)
5、父子进程各自独立打开同一文件实现共享
(1)、父进程open打开1.txt然后写入,子进程打开1.txt然后写入,结论是:分别写。
原因是父子进程分离后才各自打开的1.txt,这个时候两个进程的PCB已经独立了,文件表也独立了,因此2次读写是完全独立的。
(2)、open时使用O_APPEND标志后,实际测试结果表明O_APPEND标志可以把父子进程各自独立打开的fd的文件指针给关联起来,实现分别写。
6、总结:
(1)、父进程在没有fork之前自己做的事情对子进程有很大影响,但是父进程在fork之后,在自己的if里做的事情就对子进程没有影响了。本质原因就是因为fork内部实际上已经复制父进程的PCB生成一个新的子进程,并且fork返回时子进程已经完全和父进程脱离并且独立的被操作系统OS调度执行了。
(2)、子进程的最终目的是要独立的去运行另外的程序。