您的位置:首页 > 其它

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

2013-10-10 09:52 387 查看
关注嵌入式安卓物联网行业及人才培养,每日更新,欢迎订阅及留言讨论~~~
作者:倪键树,嵌入式安卓物联网讲师。

进程系统调用――fork函数的深入理解使用fork ()函数是一个很有意思的函数,它可以建立一个新进程,把当前的进程分为父进程和子进程。但是,有些学员在初次学习这个进程分裂函数的时候,总会出现不能理解其返回值的现象,本文对fork函数的使用及其返回值作详细的分析。
该函数的调用与普通函数有所不同,fork函数如果调用成功将会返回两次:在父进程中返回子进程的PID;在子进程中返回0。成功后,父进程和子进程都在fork()函数后继续执行。如果函数调用不成功,则返回一次,返回值为 -1。
由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。
 一般来说,在fork之后是父进程先执行还是子进程先执行是不确定的,这取决于内核所使用的调度算法。
如下图所示,当调用fork函数之后,进程空间将会出现的变化,进程空间会一分为二,当返回值pid=0时,是新创建的子进程的进程空间,子进程将完全拷贝父进程的空间(fork之前的所有数据、堆栈、寄存器、PC指针等);当返回值不等于0,即大于0时,是父进程的运行空间,父进程将会继续在fork之前的进程空间内独立运行。

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









运行结果如下所示:



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

本文出自 “Android系统开发” 博客,请务必保留此出处http://wodesteve.blog.51cto.com/4786035/1306632
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: