fork() 、vfork()、clone()

转载 2015年07月08日 10:06:05

    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()所创建的不是进程而是线程,它所复制的是除了任务结构体和系统堆栈之外的所有资源的数据结构,而任务结构体和系统堆栈是与父进程共用的。

  第二个阶段就是所创建进程的执行。子进程创建完后一般都会走自己的路。Linux为了子进程能做自己的事特意提供了一个系统调用execve(),用以执行一个可执行程序的映像,这个映像以文件形式存在(这句话其实就是说用execve()可以调用一个可执行程序,因为这个可执行程序就在磁盘上,所有是以文件形式存在的,而映像是说已经编译链接好了的,只要调入内存就可以执行,一般为二进制文件)。vfork创建的子进程要先于父进程执行,子进程执行时,父进程处于挂起状态,子进程执行完,唤醒父进程。

fork()、vfork()、clone()的区别

因为生活的复杂,这是一个并行的世界, 在同一时刻,会发生很多奇妙的事情,北方下雪,南方下雨,这里在吃饭,那边在睡觉,有人在学习,有人在运动,所以这时一个 多彩多姿的世界,每天都发生着很多事情,所以要想...
  • gogoky
  • gogoky
  • 2016年05月07日 10:35
  • 2064

Linux中fork,vfork和clone详解(区别与联系)

fork,vfork,cloneUnix标准的复制进程的系统调用时fork(即分叉),但是Linux,BSD等操作系统并不止实现这一个,确切的说linux实现了三个,fork,vfork,clone(...
  • gatieme
  • gatieme
  • 2016年05月15日 16:09
  • 16404

fork,vfork,clone与pthread_create之间的区别

进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块、虚存空间、文件系统,文件I/O、信号处理函数。所以创建一个进程的 过程就是...
  • xinsuixiaofeiyu
  • xinsuixiaofeiyu
  • 2014年03月04日 20:23
  • 1597

Linux-fork(),vfork()和clone的区别

fork()函数的作用是
  • caoyan_12727
  • caoyan_12727
  • 2016年09月09日 18:54
  • 769

Linux进程创建:fork,vfork,exec,clone总结

Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息,包括数据段,代码段,堆栈段的地址,当前进程的环境变量,文件的描述符等,在创建进程...
  • xitongfengxi
  • xitongfengxi
  • 2016年07月22日 14:42
  • 486

学习笔记——Linux fork vfork exec clone的关系

Linux的用户进程不能直接被创建出来,因为不存在这样的API。它只能从某个进程中复制出来,再通过exec这样的API来切换到实际想要运行的程序文件。     复制的API包括三种:fork、c...
  • xhrno13
  • xhrno13
  • 2013年10月30日 09:14
  • 1305

linux——浅谈fork与vfork的使用与区别

区别:1.fork:子进程拷贝父进程的数据段 vfork:子进程与父进程共享数据段 2.fork:父,子进程的执行次序不确定 vfork:子进程先运行,父进程后运行...
  • xiaowu8858892520
  • xiaowu8858892520
  • 2016年12月11日 19:11
  • 567

linux---谈谈vfork和fork的区别及exit与return

fork():创建子进程的函数,是大家比较熟悉的吧。pid_t id = fork(); 这里的vfork();也是创建子进程的函数。现在我们来剖析一下它们吧。 第一例: 先看一个fork()的例子哦...
  • xxpresent
  • xxpresent
  • 2016年06月17日 21:13
  • 3533

linux 进程创建clone、fork与vfork

首先说明Linux下的进程与线程比较相近。这么说的一个原因是它们都需要相同的数据结构来表示,即task_struct。区别在于一个有独立的用户空间,一个是共享的用户空间(如果完全没有用户空间则是内核线...
  • jiayichendddd
  • jiayichendddd
  • 2014年05月19日 22:02
  • 1596

Linux C 中vfork和fork的区别

我们知道, fork会创建一个新的进程, 这个新的进程是当前进程的子进程, 区别在于, fork函数会复制父进程的一些资源, 也就是, 仅仅是复制的关系, 而非共享。 而vfork就不同了, 利用vf...
  • stpeace
  • stpeace
  • 2015年04月02日 22:28
  • 3173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fork() 、vfork()、clone()
举报原因:
原因补充:

(最多只允许输入30个字)