在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小时内与您取得联系。