没有合适的资源?快使用搜索试试~ 我知道了~
详解linux中fork、vfork、clone函数的区别
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
8 下载量 154 浏览量
2020-09-15
10:04:15
上传
评论
收藏 113KB PDF 举报
温馨提示
试读
1页
在linux系统中,fork(),vfork()和clone函数都可以创建一个进程,但是它们的区别是什么呢?本文就这三者做一个较深入的分析,感兴趣的朋友一起看看吧
资源推荐
资源详情
资源评论
详解详解linux中中fork、、vfork、、clone函数的区别函数的区别
在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="//www.jb51.net/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函数的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
资源评论
weixin_38509656
- 粉丝: 7
- 资源: 909
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功