1. 程式人生 > >Linux複習(系統程式設計4)

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

那麼子程序結束後通過何種機制通知父程序——訊號