1. 程式人生 > >父子程序簡單分析

父子程序簡單分析

fork()為linux中程序複製程序函式,為系統呼叫fork()的過程大體可分三步 1:申請pid。2:複製pcb。3:複製程序主體。fork()一次會有兩個返回值,其中一個返回的給父程序為子程序的PID,另一個返回子程序返回值為0。
1. 因為在fork()時會複製父程序的pcb,Fork之後,子程序會拷貝父程序的PCB結構,然後對PCB裡面資料進行修改,父程序的頁表直接拷貝給子程序,父子程序共享所有的資料空間,寫時拷貝:如果父子程序任意一個程序修改資料時作業系統就會將要修改的資料所在的頁直接複製出來,之後把父程序的核心棧複製出來,這就是為什麼子程序會在fork()之後的程式碼開始執行。
2. fork()之後父子程序單獨執行,互相獨立
3. Fork之前開啟的檔案描述符:父子程序共享fork之前開啟檔案的讀寫偏移量
4. 父程序複製PCB給子程序用的是淺拷貝
5. Pcb在核心中(核心地址空間共享)(核心裡面使用的實體地址(使用者使用的虛擬地址))
6. 父子全面,區域性,堆區資料不共享
7,僵死程序:PCB存在,程序主體釋放(子程序先於父程序結束)(子程序結束父程序未獲取子程序的退出碼,從而子程序不得不儲存退出碼,所以整個PCB也就無法釋放),解決方法:給子程序重新找一個父程序或者父程序通過wait()到子程序的退出碼
8. 孤兒程序(沒有父程序的子程序):會被init接管,這就是為什麼出現僵死程序後父程序結束,子程序解除僵死狀態。