全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解linux中fork、vfork、clone函数的区别

在linux系统中,fork(),vfork()和clone函数都可以创建一个进程,但是它们的区别是什么呢???本文就这三者做一个较深入的分析!!!

1.fork()

  fork()函数的作用是创建一个新进程,由fork创建的进程称为子进程,fork函数调用一次返回两次,子进程返回值为0,父进程返回子进程的进程ID。我们知道,一个进程的地

址空间主要由代码段,数据段,堆和栈构成,那么p2就要复制相关的段到物理内存。原始的unix系统的实现的是一种傻

瓜式的进程创建,这些复制包括:

(1) 为子进程的页表分配页面,确定页表的位置;

(2)为子进程的页分配页面,确定子进程页面的位置;

(3)初始化子进程的页表;

(4)把父进程的页复制到子进程对应的页中

从图中我们可以看出除了正文段外,子进程的所有其它段都分配了物理空间,并将父进程的相关内容拷贝过来。父进程的task_struct结构中的打开文件描述符,进程组ID,

回话ID都进行复制。

下面通过简单的代码检测一下fork()函数:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys types.h="">
#include <pthread.h>
#include 
#include <iostream>
using namespace std;
int main() {
  int num = 1;
  int child;
  if(!(child =fork())) {
  cout<<&num<<endl; address:="" alt="\" child="vfork()))" class="brush:java;" else="" father="" img="" include="" int="" is:="" namespace="" num="1;" num:="" pid="" pre="" son="" src="/uploadfile/Collfiles/20170421/201704210949041534.jpg" sys="" types.h="" using=""><p>测试结果:</p><p><img alt="\" src="/uploadfile/Collfiles/20170421/201704210949041535.jpg" style="width: 630px; height: 201.393px;"></p><p>从测试结果中我们可以看到,在子进程修改了num变量的值后,父进程的num的值也发生改变,说明对于子进程和父进程来说,它们操作的是同一个地方的num值,下面就是vfork的示意图:</p><p><img alt="\" src="/uploadfile/Collfiles/20170421/201704210949041536.jpg" style="width: 508px; height: 375px;"></p><p>可以看出子进程直接共享了父进程的虚拟进程空间。</p><p>3.clone()</p><p>  clone()函数是linux系统中,用来创建轻量级进程。</p><p>函数原形:</p><pre class="brush:java;">int clone(int (*fn)(void *), void *child_stack, int flags, void *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线程标准,子进程与父进程共享相同的线程群
下面的例子是创建一个线程(子进程共享了父进程虚存空间,没有自己独立的虚存空间不能称其为进程)。父进程被挂起当子线程释放虚
存资源后再继续执行。</pre>
测试代码1:
<pre class="brush:java;">#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys types.h="">
#include <pthread.h>
#include 
#include <iostream>
using namespace std;
#define FIBER_STACK 8192
int a;
void * stack;
int func(void *){
 cout<<&a<<endl; a="" char="" creating="" int="" is="" is:="" my="" pid="" pre="" son="" stack="" the="" this="" void="">
结果:<p><img alt="\" src="/uploadfile/Collfiles/20170421/201704210949041537.png" style="width: 630px; height: 201.393px;"></p><p>测试代码2(做如下修改):</p><pre class="brush:java;">clone(func, (char *)stack + FIBER_STACK,CLONE_VFORK, 0);</pre>
结果:
<p><img alt="\" src="https://www./uploadfile/Collfiles/20170421/201704210949041538.png" style="display: block; width: 630px; height: 201.393px;"></p>
<p>很明显,在测试2中将CLONE_VM删掉之后,子进程和父进程就不会公用页表,子进程创建新的页表。从某种意义上来说,clone其实是fork和vfrok的更高层次版本,,它们的关</p>
<p>系如下(《深入理解linux内核》中描述):</p>
<p>   <strong>传统的fork()系统调用在Linux中是用clone()实现的,其中clone()的flags参数指定为sigchld信号以及所有清0的clone标志,而它的child_stack参数是父进程当前的堆栈</strong></p>
<p><strong>指针,因此,父进程和子进程暂时共享一个用户态堆栈。而vfork函数系统调用也是用clone实现的,其中clone()的参数flags指定为sigchld和CLONE_VFORK和CLONE_VM标</strong></p>
<p><strong>志,clone()的参数child_stack等于父进程当前的栈指针!!!</strong></p>
。只是有一点不明白,把int a和void * stack挪到main函数里面之后,就会出现编译错误,显示未定义a和stack,这点有些不懂,望高人指点!!!! </endl;></iostream></assert.h></pthread.h></sys></unistd.h></stdlib.h></stdio.h></pre>
</endl;></iostream></assert.h></pthread.h></sys></unistd.h></stdlib.h></stdio.h>

以上所述是小编给大家介绍的linux中fork、vfork、clone函数的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# linux  # fork  # vfork  # clone  # vfork和fork的区别  # Linux多线程中fork与互斥锁过程示例  # 浅谈Linux vfork与fork简单对比分析  # Linux中fork()函数实例分析  # linux下多线程中的fork介绍  # 的是  # 创建一个  # 可以看出  # 小编  # 挂起  # 就会  # 成了  # 相关内容  # 在此  # 不懂  # 两次  # 不明白  # 更高  # 给大家  # 并将  # 可以看到  # 做一个  # 什么呢  # 很明显  # 所述 


相关文章: 如何通过FTP服务器快速搭建网站?  ,有什么在线背英语单词效率比较高的网站?  制作网站的模板软件,网站怎么建设?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  建站之星免费版是否永久可用?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  建站之星在线版空间:自助建站+智能模板一键生成方案  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  建站主机选哪种环境更利于SEO优化?  如何做网站制作流程,*游戏网站怎么搭建?  如何选择高效便捷的WAP商城建站系统?  如何在景安服务器上快速搭建个人网站?  深圳网站制作平台,深圳市做网站好的公司有哪些?  浅析上传头像示例及其注意事项  如何在万网ECS上快速搭建专属网站?  如何用狗爹虚拟主机快速搭建网站?  如何在万网自助建站平台快速创建网站?  如何在IIS中新建站点并解决端口绑定冲突?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  常州企业网站制作公司,全国继续教育网怎么登录?  如何挑选优质建站一级代理提升网站排名?  如何快速搭建安全的FTP站点?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  建站之星后台密码遗忘或太弱?如何重置与强化?  如何解决ASP生成WAP建站中文乱码问题?  想学网站制作怎么学,建立一个网站要花费多少?  如何通过多用户协作模板快速搭建高效企业网站?  电商网站制作价格怎么算,网上拍卖流程以及规则?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  网站制作的步骤包括,正确网址格式怎么写?  西安大型网站制作公司,西安招聘网站最好的是哪个?  如何在IIS管理器中快速创建并配置网站?  中山网站推广排名,中山信息港登录入口?  h5网站制作工具有哪些,h5页面制作工具有哪些?  javascript基本数据类型及类型检测常用方法小结  如何在建站之星绑定自定义域名?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  c# 服务器GC和工作站GC的区别和设置  免费ppt制作网站,有没有值得推荐的免费PPT网站?  建站之星如何助力企业快速打造五合一网站?  外贸公司网站制作哪家好,maersk船公司官网?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何配置FTP站点权限与安全设置?  高防服务器:AI智能防御DDoS攻击与数据安全保障  做企业网站制作流程,企业网站制作基本流程有哪些?  高端建站如何打造兼具美学与转化的品牌官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。