深入理解fork()

简介:

 

                                            

最近经常在论坛上见到有初学者问关于fork()的很多疑惑。在这里把我关于fork()的体会和理解写出来供大家分享。对于fork()疑惑,无非是对于为什么fork()函数会执行一次,但是返回两次,在父进程中,返回子进程ID,在子进程中返回0.

 

 

这里就fork()的工作原理及过程进行分析。为了了解fork(),首先大家要有一个分岔的概念,也就是我上图中,fork()之后,会从fork()之后分岔出一个子进程B。fork()创建出一个子进程B,同时将父进程A的资源复制给进程B。子进程实质就是对父进程的复制。子进程出了和父进程共享字符text  段意外,其余的都是有自己独立的stack,heap。那么为什么fork()会返回2次呢?我们可以这么理解:在子进程中也有一个fork()在执行,那么他就会返回一个值。对于一个子进程来说,他可以有多个父进程,那么返回不同的数没有任何意思,所以返回0是最合适的,在父进程中,一个父进程可以有多个子进程,那么为了区分进程以及得到子进程号,所以在父进程中需要子进程返回一个子进程号。父进程永远没有办法主动获取子进程号的功能,也没有这种函数,处在在创建进程能返回子进程号之外。

 

     对于复制父进程来创建子进程,这种复制遵循各COW(copy-on-write)即为写时复制。内核并不是完全的复制所有的父进程资源给子进程。创建子进程之后,父进程会将父进程的资源标志为只读,当子进程需要改变资源的时候,就会发生复制,即复制该资源给子进程,让子进程单独自己去处理。

 

 


版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/07/20/5750853.aspx

并请联系谭海燕本人或者前往谭海燕个人主页留言

目录
相关文章
|
11月前
|
C语言
C语言 父进程fork()出的多个子进程在结束后,父进程如何回收?
我在网上找了半天都是在说wait()和waitpid()的详解或者是单个子进程的回收。答非所问。 很简单,根据wait()或者waitpid()的函数特性。没有子进程时返回-1。
75 0
|
5月前
|
算法 Unix Linux
Linux系统编程(vfork和fork)
Linux系统编程(vfork和fork)
75 0
|
数据可视化 项目管理 开发工具
|
并行计算 算法 Java
Fork/Join解读
Fork/Join解读
|
算法 物联网 Linux
创建进程 fork 函数|学习笔记
快速学习创建进程 fork 函数
创建进程 fork 函数|学习笔记
|
Ubuntu Linux 开发工具
Linux使用fork()方法创建进程
Linux使用fork()方法创建进程
153 0
Linux使用fork()方法创建进程
|
Linux
关于signal和fork的思考
fork可以在linux中创建子进程。先看man手册里面的东西: SYNOPSIS       #include        pid_t fork(void);DESCRIPTION       fork()  creates  a new process by duplicating the calling process.
1207 0
|
Linux 调度
Linux进程的创建函数fork()及其fork内核实现解析【转】
转自:http://www.cnblogs.com/zengyiwen/p/5755193.html 进程的创建之fork() Linux系统下,进程可以调用fork函数来创建新的进程。调用进程为父进程,被创建的进程为子进程。
1375 0