很多人都知道linux下有个终极函数,就是fork,它几乎是一切的源泉,是个创造者,除了内核本身,所有的用户空间程序都是它启动的,它的姊妹还有 clone和vfork,按照机制和策略的原则,这两个函数确实不应该提供,但是考虑到现代操作系统中最重要的概念-线程,linux必须对它进行全面支 持,因此就有了clone,至于vfork,仅仅是为了效率而生的,它可以免去写时复制,但是有一个约定好的前提,就是子进程不能操作父进程的空间,本文就从此展开。
linux中处处是红灯,不像别的系统给了你一大堆接口函数,告诉你应该怎么怎么调用,甚至只要用参数就能控制的一个调用却根据不同的参数分为了两个调用,这种方式实际上为你铺就了一条现成的大道,你直接走就是了,不过走之前你必须看好地图,或者把地图带在身旁,想象一下一个旅行者,拥有地图,相机等一 系列的工具,这个旅行者当然是一个专业的旅行者,可是他却不是一位探险家,不是开拓者,windows就是这么一种实现方式,msdn就是那个所谓的地 图,可是linux却恰恰相反,没有地图,只有规范和约定,只要遵守之,你想怎么走就怎么走,条条大道通罗马,你可以尽情地驰骋,因此,linux是高手 们的乐园,是初学者的地狱,不过它十分容易掌握,一个不要钱的迪斯尼乐园里面有很多好玩的游戏,你会因为不知道怎么玩而错过吗?百分之百的人都不会错过的。开头说linux处处是红灯的意思是说它只有红灯而没有围墙,windows中有围墙而没有红灯,红灯和围墙的区别是什么?实际上它们都代表了一种障碍,阻碍你前行的东西,不同的是,围墙你根本无法通过,即使用了很多工具,费了好大力气,也难免摔得遍体鳞伤,还好,你爬上围墙的时候,警察或许就看见你 了,他们会保证你即使摔伤也不会摔死(摔死的几率很大,windows蓝屏几率很大),可是红灯就不一样了,你可以随便穿越,飙车族可以轻而易举甩掉 警察,只要你有胆量,警察不算什么,实际上没有任何东西实际挡着你的路,挡着你路的仅仅是一条规则:闯红灯不对!可是真的就可以随便闯吗?还是想想现实中闯红灯的人吧,运气不好就不是摔伤那么简单了,很可能就归西了。linux就是这样一个系统,很多红灯挡着你,你一定要遵守规则。红灯的好处在于,你可以大胆探索,没有红灯的地方也没有墙,你可以随意些,而用围墙规定好的路,你就没有别的选择了。这也许就是linux和windows的区别吧。
说了半天废话,最后看一个例子:
int main()
{
if( vfork() == 0 )
{
return 0; //出错,因为return会操作堆栈,因为vfork的子进程和父进程共享所有地址空间,当然也包含堆栈,因此出错。
//exit(0); //没有问题。因为没有操作堆栈。
}
return 0;
}
如果不明白,请看内核函数sys_vfork
分享到:
相关推荐
在linux系统中,fork(),vfork()和clone函数都可以创建一个进程,但是它们的区别是什么呢?本文就这三者做一个较深入的分析,感兴趣的朋友一起看看吧
vfork函数示例
这个程序是为了分析fork()函数和vfork()函数的区别,使用的系统环境是linux
在linux下通过C语言实现了fork与vfork的区别,里面有源码,可以用gcc编译运行分析
Linux系统编程——vfork() 函数详解,相关教程如下: http://blog.csdn.net/tennysonsky/article/details/45847107
if (clone_flags & CLONE_VFORK) { 5. p->vfork_done = &vfork; 6. init_completion(&vfork); 7. } 为了方便描述我在这段代码上加了行号。 第一行首先通过copy_process()函数完成具体的进程创建工作,...
详细的描述linux系统调用fork、vfork、clone在内核中的实现,既有详细文字描述又有全部的源码加注释,有助于深入理解linux进程地址空间
功能说明 strace 命令是一种强大的工具, 能够显示任何由用户空间程式发出的系统调用....-f -F选项告诉strace同时跟踪fork和vfork出来的进程 -o xxx.txt 输出到某个文档. -e execve 只记录 execve 这类系统调用.
本文分享了Linux vfork与fork简单对比分析,分享给大家,具体如下: fork相关问题: 一、fork基础了解 fork作用为创建一个子进程,在使用了fork命令后,内核会分配新的内存块和数据结构给子进程,并且将父进程的...
4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 ...
4.3 系统调用fork()、vfork()与clone() 4.4 系统调用execve() 4.5 系统调用exit()与wait4() 4.6 进程的调度与切换 4.7 强制性调度 4.8 系统调用nanosleep()和pause() 4.9 内核中的互斥操作 第5章 文件系统 ...
1.什么是进程?它与程序有何关系? 2.进程的类型?进程的启动方式? 3.什么是前台进程?什么是后台进程? 4.如何查看进程?...8.(附加题)尝试分别写一个小程序使用fork()、vfork、clone()创建子进程或线程。
多线程编程python中有Thread和threading,在linux下所谓的线程,实际上是LWP轻量级进程,其在内核中具有和进程相同的调度方式,有关LWP,COW(写时拷贝),fork,vfork,clone等的资料较多,这里
主要介绍了简述C语言中system()函数与vfork()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下
主要介绍了深入解读Linux进程函数fork(),vfork(),execX(),分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
8.4 vfork函数176 8.5 exit函数178 8.6 wait和waitpid函数179 8.7 waitid函数183 8.8 wait3和wait4函数184 8.9 竞争条件185 8.10 exec函数188 2 目录 8.11 更改用户id和组id 192 8.12 解释器文件196 8.13 ...
8.4 vfork函数176 8.5 exit函数178 8.6 wait和waitpid函数179 8.7 waitid函数183 8.8 wait3和wait4函数184 8.9 竞争条件185 8.10 exec函数188 2 目录 8.11 更改用户id和组id 192 8.12 解释器文件196 8.13 ...