vfork(),fork()与clone()的区别

发布时间:2016-12-6 20:16:06 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"vfork(),fork()与clone()的区别",主要涉及到vfork(),fork()与clone()的区别方面的内容,对于vfork(),fork()与clone()的区别感兴趣的同学可以参考一下。

 vfork(),fork()与clone()的区别 2011-03-29 10:42:54 分类: LINUX     Linux将创建进程和执行所创建的进程分为2个阶段。第一个阶段是创建。父进程首先复制子进程,所复制出来的子进程拥有自己的任务结构体和系统堆栈,除此之外所有资源都与父进程共享。Linux提供两种方式复制子进程:一个是fork(),另外一个是clone()。fork()函数复制时将父进程的所以资源都通过复制数据结构进行了复制,然后传递给子进程,所以fork()函数不带参数;clone()函数则是将部分父进程的资源的数据结构进行复制,复制哪些资源是可选择的,这个可以通过参数设定,所以clone()函数带参数,没有复制的资源可以通过指针共享给子进程。Clone()函数的声明如下: int clone(int (*fn)(void *), void *child_stack, int flags, void *arg) fn为函数指针,此指针指向一个函数体,即想要创建进程的静态程序;child_stack为给子进程分配系统堆栈的指针;arg就是传给子进程的参数;flags为要复制资源的标志: CLONE_PARENT   创建的子进程的父进程是调用者的父进程,新进程与创建它的进程成了“兄弟”而不是“父子”   CLONE_FS           子进程与父进程共享相同的文件系统,包括root、当前目录、umask   CLONE_FILES      子进程与父进程共享相同的文件描述符(file descriptor)表   CLONE_NEWNS   在新的namespace启动子进程,namespace描述了进程的文件hierarchy   CLONE_SIGHAND   子进程与父进程共享相同的信号处理(signal handler)表   CLONE_PTRACE   若父进程被trace,子进程也被trace   CLONE_VFORK     父进程被挂起,直至子进程释放虚拟内存资源   CLONE_VM           子进程与父进程运行于相同的内存空间   CLONE_PID          子进程在创建时PID与父进程一致   CLONE_THREAD    Linux 2.4中增加以支持POSIX线程标准,子进程与父进程共享相同的线程群 fork()可以看出是完全版的clone(),而clone()克隆的只是fork()的一部分。    为了提高系统的效率,后来的Linux设计者又增加了一个系统调用vfork()。 vfork()会产生一个新的子进程.但是vfork创建的子进程与父进程共享数据段,而且由vfork创建的 子进程将先于父进程运行.fork()的使用详见百度词条fork(). vfork()用法与fork()相似.但是也有区别,具体区别归结为以下3点: 1. fork():子进程拷贝父进程的数据段,代码段. vfork():子进程与父进程共享数据段. 2. fork():父子进程的执行次序不确定. vfork():保证子进程先运行,在调用exec或_exit之前与父进程数据是共享的,在它调用exec 或_exit之后父进程才可能被调度运行。 3. vfork()保证子进程先运行,在她调用exec或_exit之后父进程才可能被调度运行。如果在 调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。 4.当需要改变共享数据段中变量的值,则拷贝父进程。   子进程创建完后一般都会走自己的路。Linux为了子进程能做自己的事特意提供了一个系统调用execve(),用以执行一个可执行程序的映像,这个映像以文件形式存在(这句话其实就是说用execve()可以调用一个可执行程序,因为这个可执行程序就在磁盘上,所有是以文件形式存在的,而映像是说已经编译链接好了的,只要调入内存就可以执行,一般为二进制文件)。vfork创建的子进程要先于父进程执行,子进程执行时,父进程处于挂起状态,子进程执行完,唤醒父进程。

上一篇:cocoa2D:基本概念(2)
下一篇:Posix的两种信号量的总结

相关文章

相关评论