Posted on 2009-04-15 22:48
Prayer 阅读(2917)
评论(1) 编辑 收藏 引用 所属分类:
LINUX/UNIX/AIX
fork () 的作用是什么?换句话说,你用 fork () 的目的是什么?
――是为了产生一个新的进程,地球人都知道
产生一个什么样的进程?
――和你本来调用 fork () 的那个进程基本一样的进程,其实就是你原来进程的副本
真的完全一样吗?
――当然不能完全一样,你要两个除了 pid 之外其它一模一样的进程干什么,就算 cpu mem
再多也不用这么摆谱吧?
哪里不一样?
――当然最重要的是 fork () 之后执行的代码不一样,you know, i know
怎么实现呢?
――如果是 Windows,它会让你在 fork () 里面提供一大堆东西,指明这个那个什么的……
我用的是 unix 啊
――所以很简单,unix 会让两个进程(不错,原来是一个,unix 替你复制了一个,现在有两个):
在 fork () 之后产生不同:返回值不同。其中一个进程(使用新的 pid)里面的 fork () 返回零,
这个进程就是“子进程”;而另一个进程(使用原来的 pid)中的 fork () 返回前面那个子进程的
pid,他自己被称为“父进程”
然后呢?
――写代码的人又不笨,当然就根据返回值是否非零来判断了,现在我是在子进程里面呢,还是在
父进程里面?在子进程里面就执行子进程该执行的代码,在父进程里面就执行父进程的代码……
有铁杆 windows fans 借此说明,windows 好啊,子进程用子进程的代码,父进程用父进程的,
你 unix 笨了吧,子进程包含父进程、子进程的代码,父进程包含父进程子进程的代码,岂不是多"
占用内存了吗?
共享同一代码段,增加的只是全局共享数据和对文件描述符的引用等,另外就是堆栈。你一个代码:
长达 10M 的进程,fork () 出三四个子进程,只是增加一点内存占用(如果你没有使用很多全局变量
的话),而不是占用 40M 以上的内存。
父进程里面有个变量 var,子进程里面也有个变量 var
linux 是多用户和多进程的操作系统,进程在操作系统中的创建,都会生成一个进程描述块,描述当前进程的所有信息,包括,数据段、代码段、堆栈段的地址,当前进程的环境变量,文件描述符等。
fork函数过程:操作系统先创建一个进程描述块,然后把父进程的所有进程描述符的信息精确拷贝过来,和父进程一样(除了进程ID不一样外),代码段共享,数据段和堆栈段复制,所有的寄存器的值全部精确拷贝,文件描述符也许精确拷贝。
fork的返回值,fork在父进程空间中返回子进程的PID,在子进程空间中返回0。