关注嵌入式安卓物联网行业及人才培养,每日更新,欢迎订阅及留言讨论~~~

作者:倪键树,嵌入式安卓物联网讲师。



进程系统调用——fork函数的深入理解使用

fork ()函数是一个很有意思的函数,它可以建立一个新进程,把当前的进程分为父进程和子进程。但是,有些学员在初次学习这个进程分裂函数的时候,总会出现不能理解其返回值的现象,本文对fork函数的使用及其返回值作详细的分析。


该函数的调用与普通函数有所不同,fork函数如果调用成功将会返回两次:在父进程中返回子进程的PID;在子进程中返回0。成功后,父进程和子进程都在fork()函数后继续执行。如果函数调用不成功,则返回一次,返回值为 -1


由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的副本,这意味着父子进程间不共享这些存储空间。


 一般来说,在fork之后是父进程先执行还是子进程先执行是不确定的,这取决于内核所使用的调度算法。


如下图所示,当调用fork函数之后,进程空间将会出现的变化,进程空间会一分为二,当返回值pid=0时,是新创建的子进程的进程空间,子进程将完全拷贝父进程的空间(fork之前的所有数据、堆栈、寄存器、PC指针等);当返回值不等于0,即大于0时,是父进程的运行空间,父进程将会继续在fork之前的进程空间内独立运行。

进程系统调用——fork函数的深入理解使用_Linux多进程

下面的小程序可以帮助更好的来理解fork函数的使用:

进程系统调用——fork函数的深入理解使用_Linux多进程_02

进程系统调用——fork函数的深入理解使用_父子进程关系_03

进程系统调用——fork函数的深入理解使用_fork函数深入剖析_04

运行结果如下所示:

进程系统调用——fork函数的深入理解使用_父子进程关系_05

运行结果完全符合上述分析过程,这样对fork函数的理解会更清晰,对父子进程的运行空间有所理解。