很多人都知道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;
vfork和clone 紅燈和圍牆
很多人都知道linux下有個終極函式,就是fork,它幾乎是一切的源泉,是個創造者,除了核心本身,所有的使用者空間程式都是它啟動的,它的姊妹還有 clone和vfork,按照機制和策略的原則,這兩個函式確實不應該提供,但是考慮到現代作業系統中最重要的概念 執行緒,linux必須對它進行全面支 持,因...
fork,vfork,fork和vfork區別詳解
一 fork pid t fork void 功能 建立乙個新程序。返回值 一次呼叫兩次返回,子程序返回0,父程序返回子程序id,出錯返回 1。1 兩次返回分別是程序id和0,父程序會拿到子程序的id,子程序返回0,藉此可以分別出父子程序,編寫不同的處理分支。2 通過fork建立的子程序就是父程序的...
Java中的clone和深度clone
複製物件 or 複製引用 person p new person 23,zhang person p1 p system.out.println p system.out.println p1 當person p1 p 執行之後,是建立了乙個新的物件嗎?首先看列印結果 person p new pe...