Unix环境高级编程:fork, vfork, clone
2015-08-03 09:59
232 查看
fork
fork产生的子进程是传统意义上的进程,fork之后执行路径就互不关联了,一旦fork返回后面的代码就在不用的进程上下文中执行了。到底是子进程先执行还是父进程先执行一般是随机的或者依赖实现的。vfork
vfork使得“子进程”先于“父进程”执行,子进程在父进程的进程空间中执行直到其调用exec。vfork的使用还是要相对小心的,vfork最摸个作用域内调用时,在子进程执行的时候,如果父进程将来会使用到该作用域内的变量,则子进程不能使用return语句退出当前函数框架。如下面的代码:#include <stdio.h> #include <unistd.h> pid_t invoke_vfork() { int count = 0; pid_t pid = vfork(); if (pid == 0) { while (++count < 10000); } else { printf("count value %u\n", count); } return pid; } int main() { printf("before invoke_vfork\n"); if (invoke_vfork() == 0) { _exit(0); } printf("after invoke_vfork\n"); return 0; }
如上述的代码运行后回输出:
before invoke_vfork count value 3560223176 after invoke_vfork
看起来还是相当诡异的,如果我们把_exit(0)直接放入到子进程那个函数分支内部则没有这个问题:
pid_t invoke_vfork() { int count = 0; pid_t pid = vfork(); if (pid == 0) { while (++count < 10000); _exit(0); } else { printf("count value %u\n", count); } return pid; }
输出:
before invoke_vfork count value 10000 after invoke_vfork
不过一般也不会这么使用,直接exec就没有问题了。
clone
clone是Linux平台上专有的系统调用,可以更细粒度的指定子进程与父进程共享的内容,可以用来创建LWP,也即线程。相关文章推荐
- C语言编程入门——动态内存分配
- 关于栈、堆、静态变量区的访问效率
- php 中的 short_open_tag 的作用
- C++中cout和cerr的区别?
- C#中的 SET ,GET
- github 之ssh创建
- 基于php-fpm的配置详解[转载]
- eclipse(android)真机调试无法打印logcat解决方案
- Genymotion+SDK+MyEclipse开发遇到adb问题解决方案
- Java过滤器和监听器详解
- 【转】java程序访问derby的两种模式实例
- wcf纯代码创建控制台应用
- 决策树--Python实现
- 使用rbenv来管理Ruby版本的方法
- C语言文件操作函数大全(超详细)
- java常用的7大排序算法汇总
- [集合]c/c++常见编译错误
- 知识点梳理总结(2,STRUTS1路径配置篇)
- 基于VB和研华1710lL采集卡的摩擦温度采集
- python os.path模块