Linux複習(系統程式設計4)
父子程序
1.父子程序之間資料(.data\ .bss\ .stack\ .heap),都是不共享的
父子程序任意一個程序對資料的修改並不會影響另一個程序的資料
2.寫時拷貝技術 —— .heap段
fork之後,父子程序共享所有的資料區域,但是核心將這些區域設定為只讀,父子程序中任意一個程序試圖修改資料,核心會將要修改的資料所在的頁拷貝一份。
作用:提高fork的效率
fork之後,子程序往往會呼叫新的exec替換新的程序
3.父子程序是否共享fork之前開啟的檔案描述符
共享:子程序能夠使用fork之前開啟的檔案描述符訪問檔案的內容
父子程序通過fork之前開啟的檔案描述訪問檔案時,是相互影響的——讀寫偏移量
如果子程序先結束,子程序結束時會執行close(fd),有沒有關閉檔案?
子:close(fd) 父:sleep(1);write();
殭屍程序
程序主體結束,但是程序的PCB依舊存在。在多程序程式設計中,父程序未結束,但是子程序已結束。
存在的意義:程序有四種結束方式,程序結束後,程序的退出狀態需要儲存到PCB結構中,為父程序獲取子程序的退出狀態。
程序真正結束:1.程序主體退出
2.PCB釋放——父程序獲取子程序的退出狀態以後
父程序如何獲取子程序的退出狀態——已處理僵死程序,有兩種方式:
1.pid_t wait(int *status); 返回處理的子程序PID,阻塞執行
2.pid_t waitpid(pid_t pid,int *status,int flag);
兩個處理方式的區別為,第一種是阻塞執行,當條件未發生時,函式等待條件發生,條件發生後,函式才可以返回;第二種是非阻塞執行,無論條件是否發生,函式都會即可返回。
如果父程序建立n個子程序,wait呼叫n次。
父程序退出後為什麼也能處理僵死程序?
如果父程序結束,則子程序會被掛在init下面。init是系統程序,其功能之一是處理僵死程序。
如果父程序不阻塞,還能及時處理僵死程序
wait呼叫時機:子程序已結束,父程序呼叫wait
那麼子程序結束後通過何種機制通知父程序——訊號