程序和進程的區別
- 程序是編好的二進制文件,在磁盤上不佔用內存,cpu等系統資源
進程是程序運行一次的過程,佔用cpu和內存等系統資源 - 一個程序可以有多個進程,但是一個進程只屬於一個程序
併發和並行的區別
併發是在一個cpu上利用時鐘中斷,模擬多個程序同時進行的效果
並行是有多個核,每個核上有不同的線程在運行,是真正的同時運行
fork函數
- 頭文件
<sys/types.h>
<unistd.h> - 函數原型
pid_t fork()
返回值:
等於0:返回的是子進程
大於0:返回的是父進程的id
小於0:函數執行失敗
注意:如果是想用for循環開多個進程,需要在子進程中break,不然子進程也會執行for中內容
父子進程區別
相同處:子進程會複製父進程的堆,棧,數據段,代碼段,全局變量區,環境變量等(遵循讀時共享,寫時複製)
不同處:進程id,fork返回值,父進程id,進程運行時間,定時器,未決信號集
exec函數族
這裏介紹倆個重點學的,所有的exec函數族都是調用execve的系統函數去完成調用(成功無返回,失敗返回-1)
int execl("./fork",“fork”,NULL):第一個參數規定路徑以及程序名,第一個參數調用的程序名,最後沒有參數就以NULL結尾
int execlp(“ls”,“ls”,"-l",NULL):第一個參數因爲是用的系統環境變量路徑就不用在前面再加路徑,直接寫方法名,後面於第一個方法使用相同
孤兒進程
- 產生原因:父進程在子進程前結束,這是孤兒進程會交於系統的init進程管理,並回收相關的資源
- 解決辦法:孤兒進程會交由系統進程管理,因此不會產生垃圾,但是爲了防止init進程管理的孤兒進程數量過大可能會崩潰,因此可以最好還是調用wait管理
殭屍進程
- 產生原因:父進程在子進程終止時,沒有回收相關資源,在程序結束時系統會回收程序堆棧等資源,但是在內核中的pcb還保留着,以及程序正常退出則保留着程序退出的狀態,如果程序異常終止,則保留着導致進程終止的信號是哪個
- 處理方法:
殺死父進程,他會被交由init進程管理。
wait方法:阻塞父進程,並清理子進程在內核的存儲,獲取退出狀態
waitpid:可以設置非阻塞回收
用進程退出時產生的SIGCHLD信號,對該信號進行處理回收內核資源