我们利用fork函数来辅助我们讲解进程
首先认识两个调用进程地址的函数:getpid(),和getppid(),他们分别可以调用自己的pid和父进程的pid
fork()可以在代码层面来创建子进程,一般而言,父进程fork出来的子进程与父进程代码和数据相同,头文件是<unistd.h>,返回值是get_t:
看到图示的代码和之前理论所说,会发现有很多问题,我们来一一解决:
1,为什么给id返回0的是子进程而返回id大于0的是父进程?
父进程要对子进程进行管理,也就是权限更大,而子进程无权管辖父进程,所以没必要给子进程返回pid,而父进程因为要管理子进程所以可接收子进程的pid
由图可得知,父进程的pid和子进程的ppid互相对应
在进程fork之后,父进程与子进程的代码是共享的,一般来说不能被修改
但是数据是可以被修改的,原先是和父进程共享同一个数据,但是系统会检查你是否对子进程的数据修改,如果修改了,系统就会触发写时拷贝(往后细说),会把父进程的数据复制下来给子进程修改使用,这也使得子进程具有一定的独立性。
那我们为什么要创建子进程?:为了完成与父进程不一样的工作。
2,理解为什么一个函数会有两个返回值?
一般来说,我们写代码的时候函数return一次之后就会直接退出销毁,为什么fork函数却可以返回两次返回值?
通过上面的知识储备我们知道,fork会创建一个代码共享数据独立的子进程,也就是说在fork创建出一个子进程的时候,这时父进程和子进程会同时运行,并且通过拷贝,父子进程的代码段和数据也是暂时相同,但是我们知道,每个进程都会有自己的pid,父进程创建的子进程也不例外也有自己的pid,同时被cpu进行调度,所以父进程和子进程本质上就是一个代码相同,数据不同的两份程序或代码,本质上也是属于调用了两个函数,所以这就是为什么一个函数会有两个返回值的原因:
3,一个变量为什么会有两个不同的内容?
这个问题可以从前面的讲解中推导出来,在我们对子进程的数据进行写入修改的时候,系统会促发写时拷贝,让子进程的数据与父进程的数据相互独立,修改时互不影响,又因为父进程和子进程本质上就是两个同时运行的代码,所以可以实现一个变量两个不同内容。
4,fork函数究竟在干什么?
综上所述,fork函数的作用就是在运行的时候创建一个子进程,并返回子进程的pid,通过上面的讲解,我们可更深刻的认识到fork的作用与进程的理解。