码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-19 23:47:56      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:

Linux提供三种方式复制子进程:fork()clone(),vfork()

区别:

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()与fork()的主要区别是:

1)创建一个新进程,而该新进程的目的是为了exec一个新程序,shell基本部分就是这种类型程序的一个例子,它跟fork()一样都是创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec(或exit),于是也就不会存访该地址空间。不过在子进程调用exit或exit之前,它在父进程的空间中运行。这种工作方式在某些UNIX的页式虚存实现中提高了效率。

2)vfork创建的子进程要先于父进程执行,子进程执行时,父进程处于挂起状态,子进程执行完,唤醒父进程。而fork()之后父进程先执行还是子进程先执行是不确定的。

3)clone()和vfork()可用于创建线程。

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:

原文地址:http://blog.csdn.net/sinat_24520925/article/details/47789635

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!