天天看點

為什麼fork建立子程序後,父程序中運作過的代碼在子程序中不再運作了

為什麼fork建立子程式後,父程式中運作過的代碼在子程式中不再運作了

老羊快跑微信公衆号,内有老羊的《200分鐘PCB設計傻瓜教程》,免費觀看

一個程序,包括代碼、資料和配置設定給程序的資源,當然還有程序運作的狀态。Linux下fork()函數通過系統調用建立一個與原來程序幾乎完全相同的程序,一般課堂上講的是“子程序是父程序的一個完整拷貝”,也就是兩個程序可以做完全相同的事,但如果初始參數或者傳入的變量不同,兩個程序也可以做不同的事。

      一個程序調用fork()函數後,系統先給新的程序配置設定資源,例如存儲資料和代碼的空間。然後把原來的程序的所有值(包括狀态)都複制到新的新程序中,隻有少數值與原來的程序的值不同。相當于克隆了一個自己。

那麼問題來了:從下面的程式和運作結果我們知道父程序的程序号是4254,子程序的程序号是4255,指令行終端的程序号是4232,那麼為什麼在執行程式的時候,子程式沒有執行第一行語句“printf("$+%d\n",getpid());”  ?子程序不是父程序的完整拷貝麼?

為什麼fork建立子程式後,父程式中運作過的代碼在子程式中不再運作了

答案:的确子程序包含有和父程序一樣的代碼和資料(雖然一樣但的确是自己的一份)。但别忘了,自己成複制的不僅是父程序的代碼和資料,還包括狀态,這個狀态就包含有PC指針寄存器的值。也就是說子程序建立完成後,他和父程序一樣,PC指針都指向下一條語句, 是以子程序是從自身建立完成後的地方繼續運作,而父程序運作過得代碼将不再運作。這就是為什麼fork之前已經運作過的printf函數沒有在子程序中運作的原因。

繼續閱讀