首先,我們來回憶一下父程序與子程序,前幾節講了如何建立子程序,像這樣的,pid_t id = fork(); 這樣我們就建立好了乙個子程序,然而fork()函式的返回值是什麼呢?這裡要記住:子程序返回0,父程序返回子程序的pid,如果建立失敗的話就返回-1.由於是父程序建立的子程序,那麼子程序就繼承自父程序。比如,子程序繼承了父程序的資料空間,堆和棧的副本。但是,父子程序是不是就共享同一片位址空間呢?答案是否定的。這就引出了我們前幾節講的虛擬位址的內容。回憶一下:
它們就是父子程序所對應的位址空間,雖然它們的虛擬位址是一樣的,但是它們的實體地址卻是不一樣的。(這幅圖的詳細介紹見本部落格《linux之位址空間》)
父子程序不共享儲存空間,只共享**段。
下面看乙個例子:
想一想這個**執行的結果是什麼呢?
很多人看了這個**之後以為它會輸出4條語句,但其實不然。我們來分析一下其中的奧秘吧,嘿嘿。。。
首先,父程序建立子程序,則父子程序各列印一條自己的pid,列印完之後i++;i++;這時父程序又重新建立子程序,上一級的子程序又進入到父程序,從而又建立子程序,這樣i=1時相當於父子程序各建立了2個程序,即第二級建立了4個程序,所以程序數= 2+4=6.
結果如下哦:
這個圖是不是有點像二叉樹呢?
那麼當i = 10的時候呢?
經過上述的分析推理得知它的結果是這樣的:2+2^2+2^3+……+2^10=2046
當i = n時,公式為:2+2^2+2^3+……+2^n = 2*(1-2^n)/(1-2);
Linux程序程式設計之父子程序的等待
程式設計過程中,有時需要讓乙個程序等待另乙個程序,最常見的是父程序等待自己的子程序,或者父程序 自己的子程序資源包括殭屍程序。這裡簡單介紹一下系統呼叫函式 wait 函式原型是 include include int wait int status 函式功能是 父程序一旦呼叫了wait就立即阻塞自己...
Vue 之父子元件間的通訊
兄弟元件間傳值 一覽圖 1 靜態傳值 1 在父元件中 在子元件佔位符中直接寫 引數名 引數值 father this is father h1 靜態 父傳子 字串 msg from father.div template 引入子元件,必須 import child from components c...
Linux 父子程序與fork
每個程序都有乙個非負整數表示的唯一程序id,如交換程序 即排程程序 id為0,init程序id為1,頁守護程序id為2 原型如下 fork函式被呼叫一次,但返回兩次,兩次返回的區別就是子程序返回的是0,父程序返回的新子程序的id 子程序是父程序的副本,獲得了父程序資料空間 堆和棧的副本 父子程序並不...