fork与vfork 的研究
2016-07-19 23:02
183 查看
fork:
pid_t fork(void)函数可用于创建子进程
一个现有进程可以调用fork创建一个新进程
返回值:子进程返回0,父进程返回子进程ID,出错返回-1
子进程是父进程的副本,例如:子进程获得父进程数据空间,堆和栈的副本(主要是数据结构的副本)。父子进程不共享这些存储空间部分,父子进程不共享这些存储空间部分。父子进程共享正文段。由于fork之后经常归属exec,所以现在很多实现并不执行一个父进程数据段,栈和堆的完全复制,作为替代,使用了写时拷贝计数,这些区域由父子进程共享,而且内核将他们的访问权限改为只读的。如果父子进程中的人一个试图修改这些区域,则内核只为修改的那块内存制作一个副本。
vfork:
vfork函数的调用序列和返回值与fork相同。但两者的语义不同。
vfork用于创建一个新进程,而该新进程的目的是exec一个新程序。vfork与fork都创建一 个子进程,但它不将父进程的地址空间复制到子进程中,因为子进程会立即调用 exec,于是不会存访问该地址空间。相反,在子进程调用exec或exit之前,它在父进程的空间中运行,也就是说会更改父进程的数据段、栈和堆。vfork和fork另一区别在于 :vfork保证子进程先运行,在它调用exec或(exit)之后父进程才可能被调度运行。
子进程直接改变了父进程的变量值,因为子进程在父进程的地址空间中运行。
pid_t fork(void)函数可用于创建子进程
一个现有进程可以调用fork创建一个新进程
返回值:子进程返回0,父进程返回子进程ID,出错返回-1
子进程是父进程的副本,例如:子进程获得父进程数据空间,堆和栈的副本(主要是数据结构的副本)。父子进程不共享这些存储空间部分,父子进程不共享这些存储空间部分。父子进程共享正文段。由于fork之后经常归属exec,所以现在很多实现并不执行一个父进程数据段,栈和堆的完全复制,作为替代,使用了写时拷贝计数,这些区域由父子进程共享,而且内核将他们的访问权限改为只读的。如果父子进程中的人一个试图修改这些区域,则内核只为修改的那块内存制作一个副本。
vfork:
vfork函数的调用序列和返回值与fork相同。但两者的语义不同。
vfork用于创建一个新进程,而该新进程的目的是exec一个新程序。vfork与fork都创建一 个子进程,但它不将父进程的地址空间复制到子进程中,因为子进程会立即调用 exec,于是不会存访问该地址空间。相反,在子进程调用exec或exit之前,它在父进程的空间中运行,也就是说会更改父进程的数据段、栈和堆。vfork和fork另一区别在于 :vfork保证子进程先运行,在它调用exec或(exit)之后父进程才可能被调度运行。
<span style="font-size:24px;">#include<stdio.h> #include<string.h> #include<unistd.h> #include<stdlib.h> int g_val = 0; void fun() { printf("child exit\n"); } int main() { int val = 0; pid_t id = vfork(); if(id < 0) { exit(1); } else if(id == 0) //child { atexit(fun); printf("this is child process.\n"); ++g_val; ++val; sleep(3); exit(0); } else { printf("this is father process\n"); printf("father exit, g_val = %d, val = %d\n", g_val, val); } return 0; } </span>
子进程直接改变了父进程的变量值,因为子进程在父进程的地址空间中运行。
相关文章推荐
- 一个java数学题,给定一个数组,除了一个数出现1次之外,其余数都出现3次,输出出现一次的那个数。
- 实现jQuery底层链式编程(二)
- 设计模式初探
- 参数数组和普通数组
- Git学习(一)
- 集合映射
- 记录输入三数排序,字符串操作
- Android studio启动到指定Activity
- 2016第30周二
- TOYS-POJ2318
- 注解 @RequestMapping
- 设计模式之策略模式
- Hadoop 2.x源码包编译
- 移动端各终端的适配问题研究--关于viewport
- 百度地图sdk使用(2) 定位
- 编辑中常用命令
- CI3.0控制器下面建文件夹 访问一直404 的解决方法
- NET Core 的 Views
- 100. Same Tree
- UNCodeWeb不编写任何代码实时搭建基于AJAX的Web应用(零代码搭建Web应用)