1. getpid可以獲取程序id。getppid可以獲取程序呼叫程序的id。
2. fork函式:一次呼叫,兩次返回:返回0是在子程序中。返回其他值在父程序中。如果大於0為子程序id;否則失敗。
3. 子程序獲得了父程序的資料空間(data,bss),堆,棧的副本。程序之間共享正文段。
4. 目前的實現一般不進行全部複製,而實現的是寫時複製:及經常唯讀共享部分,乙個程序去更改一塊記憶體是,為這塊記憶體建立乙個副本。
5. fork函式產生的子程序會繼承父程序的檔案描述符。這裡我們遇到過乙個問題。同時也會繼承父程序的資源限制等很多的東西。
6. fork失敗,可能經常過多。也可能是程序有了太多的子程序。子程序最大值為child_max。
7. 好好研究一下fork,vfork,clone,特別他們的相同之處和差異之處。
8. vfork和fork的區別:vfork之後不會進行複製,它完全使用父程序的位址空間。它的目的是呼叫這個函式後,馬上呼叫exec。vfork會阻塞父程序,首先執行的子程序,子程序return或者exit後,父程序才允許。在子程序中對變數的修改,都會同步到父程序。他們使用的是同乙個空間。如果在呼叫exec或者exit之前呼叫依賴於父程序的進一步動作,會導致死鎖。
9. 程序終止:exit,_exit,_exit(這兩個_exit unix下不清洗緩衝區,由exit呼叫),main中return, 最後乙個執行緒return,最後乙個執行緒呼叫thread_exit。異常終止:呼叫abort,接收某些訊號,對最後乙個執行緒取消。
10. 殭屍程序:unix中,乙個已經終止,但是父程序尚未對齊進行善後處理(獲取終止程序的有關資訊,釋放它仍然占有的資源)的程序稱之為殭屍程序。
11. 殭屍程序的避免:基本有兩種方法:一是在自程序中馬上呼叫fork,這樣子程序的子程序會被init程序接管。另外乙個方法是使用信用:single(sigchld, sig_ign(忽略這個訊號即可)),接收這個訊號即可。如果要在程序結束後進行一些處理應該如何,如何獲取子程序的id?
12. 如果乙個程序終止,核心會向程序的父程序傳送訊號:sigchld。然後父程序可以在訊號處理地方呼叫wait或者waitpid查詢程序的終止狀態。這兩個函式返回的pid的值,入參返回的是種子狀態。wait是阻塞式的,會阻塞直到有程序終止。waitpid可以指定要等待的程序的pid,並且可以設定是否阻塞。
13. waittid提供更多的靈活性,wait3和wait4能夠獲取子程序的資源資訊。
14. exec並不建立新程序,程序id前後未變,exec只是用乙個全新的程式代替當前程序的正文,資料,堆和棧段。
15. exec執行時不會關閉檔案流,除非用fctl設定標誌fd_cloexec,但會關閉目錄流。
16. system函式呼叫三個函式:fork,exec,waitpid,它是阻塞式的。設定使用者id或者設定組id程式決不允許呼叫system函式。
17. 會計記錄對應於程序而不是程式。其實就是一種經常統計。
多程序在呼叫fork後,函式返回後,父程序和子程序就是在不同的記憶體空間了,他們彼此無法訪問對方的記憶體了。
fork函式在子程序中返回0,在父程序返回小於0則申請子程序失敗,大於0表示子程序的pid,成功。
APUE學習 程序控制
程序識別符號在系統中是唯一的。unix採用延遲技術來分配pid。因為,如果乙個程序終止了,馬上把他的pid分配給新的程序,而且這個新程序與舊程序要做一樣的事。那麼別人就不知道這是新程序還是舊程序在做了。類似於tcp4次揮手的最後一步。還有一些特殊的程序,例如pid為0的程序,這個可以看成是乙個核心的...
APUE 程序控制 中
當乙個程序正常或異常終止時會向父程序傳送sigchld訊號。對於這種訊號系統缺省會忽略。呼叫wait waidpid的程序可能會 include include pid t wait int statloc pid t waitpid pid t pid,int statloc,int option...
APUE學習筆記 19 守護程序
by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 13章。2.總結了守護程序的基本概念 程式設計規則以及如何進行出錯處理。3.守護程序 守護程序也稱精靈程序 daemon 是生存期較長的一種程序。它們常常在系統自舉時啟動,...