APUE學習筆記——進程控制

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. 會計記錄對應於進程而不是程序。其實就是一種經常統計。
18. 進程時間:可以使用times獲得三個時間,牆上時間(函數返回),用戶時間,系統時間,以及子進程的時間。

多進程在調用fork後,函數返回後,父進程和子進程就是在不同的內存空間了,他們彼此無法訪問對方的內存了。

fork函數在子進程中返回0,在父進程返回小於0則申請子進程失敗,大於0表示子進程的pid,成功。
發佈了291 篇原創文章 · 獲贊 48 · 訪問量 158萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章