vfork和clone--红灯和围墙

来源:互联网 发布:神经网络 凸优化 编辑:程序博客网 时间:2024/05/17 02:10

很多人都知道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