c語言基礎(十三)

1、進程結束後資源處理的問題
每一個進程結束之後都會涉及到資源清理的問題:資源1:操作系統會回收裏的進程中涉及到資源(棧、堆(malloc)、文件IO);資源2:進程建立時,會自動產生一個task_struct(8KB),這個就是你這個當前進程
包含所有信息的一個結構體(來自於父進程),這個結構體相當於(文件描述符),他是進程描述符。存在於進程管理表中,這裏的資源操(進程運行也是需要棧)作系統無法給你回收,只能由他的父進程回收。
2、殭屍進程
前情提要:子進程先結束,父進程(知道)不一定立刻給這個子進程”收屍”,父子進程間(回收資源)是異步通信的。子進程已亡,父進程尚未給其”收屍”,此時這個進程就是殭屍進程。子進程此刻只有task_struct(8KB)和進程運行的棧,未被釋放。
回收資源:(1)父進程可以調用wait或者waitpid對子進程的資源進行回收。(2)linux設計的時:如果沒有函數進行回收子進程資源,父進程在自己結束後會自動釋放子進程資源。
3、孤兒進程
前提:父進程先於子進程結束,此時子進程就是一個孤兒進程(尚未結束)。這個子進程就會被init(進程1)收養,相當於子進程有了父親。
4、wait和waitpid
wait原理:
(1)子進程先結束,會發一個信號SIGCHLD.
(2)父進程調用wait收屍,如果子進程沒有結束,就一直在等,會阻塞在這裏。
(3)有資源回收函數,信號發給父進程,此時就可以回收(殭屍進程),父進程可以及時回收資源。沒有資源回收函數,什麼時候回收資源,父進程安排,通信是異步通信的。
(4)父進程沒有子進程的情況,wait返回值錯誤。
waitpid:
(1)回收子進程資源
(2)可以指定特定的pid值(特定進程)
(3)設置阻塞或者非阻塞模式
pid_t waitpid(pid_t pid, int *status, int options);
參數:options 設置函數阻塞或者非阻塞的模式 (1)WNOHANG非阻塞 (2)0(零)阻塞
驗證:PS:子進程、父進程,誰先運行,不規定;一旦有了父wait,肯定是我們子進程先結束。
system函數
PS:題目:
一個父進程,該父進程創建的兩個子進程,其中一個子進程執行“ls -l”命令,
另一個子進程在5s之後發一個鬧鐘信號(執行鬧鐘信號處理函數)正常退出。
父進程用阻塞方式等待第一個子進程的結束,然後用非阻塞方式等待另一個子進程的退出,
待收集到第二個子進程結束的信息,父進程就返回。
總結:1、每一個獨立的進程結束之後,最好由return exit _exit正常結束。2、每一獨立的進程裏面時運行一個應用程序的。
5、exec族
(1)execl 和 execv
完成函數裏的程序調用後(切換進程了,此進程(ls -l)調用完就結束整個進程(子進程直接結束了)),此進程
(子進程)其他的代碼都不會執行。這個路徑,可以是全路徑,也可以是相對路徑。
(2)execlp 和 execvp
優先在PATH環境變量下,找,如果沒有找到就去當前目錄找;可執行文件可以不加路徑
(3)execle
e就是環境變量,將來你的程序需要環境變量,就可以向這個數組裏寫(你自己的環境變量), 代替之前系統默認的那一託(環境變量)。

前情提要:寫父進程寫文件(“123”),子進程讀文件(“123”), 普通文件在父子進程間的通信。
6、linux下主流的進程通信方式:無名管道、有名管道、信號、消息隊列、共享內存、信號量、網絡
無名管道:1、文件系統下不可見,但是可以通信(read/write) 2、用於父子進程
原理:有一個管道(文件), 父子進程中都一個讀端和寫端。雙方都可以寫,也都可以讀,半雙工通信。
有名管道:(1)、可見的,但是當通信結束,裏面沒有內容(2)、先進先出,不支持lseek(文件指針定位)。
(3)、可以是父子件進程,也可以是毫不相干(陌生的)進程之間通信。
遇到的問題:寫的(進程)一方寫進出之後,管道關閉,通信就結束了。所以讀端(進程),就再也讀不到了,卡在read函數處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章