程序指正在運作的程式,資源配置設定的最小機關,可以通過“ps ”或“top”等指令檢視正在運作的程序,線程是系統的最小排程機關,一個程序可以擁有多個線程,同一程序裡的線程可以共享此程序的同一資源。本章代碼在process/目錄下。
程序類型:
1.互動程序:由shell啟動,使用者和計算機進行問答的程序。
2.批處理程序:不與特定終端相關聯,将任務送出到等待隊列按順序執行的程序。
3.守護程序:背景運作的特殊程序,使用者不能和它進行會話。
程序的三種狀态:
1.運作态,正在運作或在運作隊列中等待。
2.可中斷等待态,休眠, 在等待申請的資源有效或等待中斷,信号喚醒。
3.不可中斷等待态,休眠等待資源有效,不能被中斷或信号喚醒。
4.終止态,程序被停止或者被跟蹤狀态,收到SIGCONT信号時,又會恢複運作狀态。
5.僵屍态,程序因某種原因而中止運作,但程序描述符仍存在,不可被Kill。
如果想銷毀某一程序,可在終端輸入“ps -elf”檢視程序号,如圖 66.2:
如果要銷毀qtcreator程序,使用“kill -9 3001”可以銷毀它,
1程序建立
所有的程序都是由其他程序建立(除了pid為0号的idle程序),pid号為1的init程序是系統啟動後運作的第一個程序,是所有程序的父程序,init程序會初始化一部分系統服務,建立其他程序。
建立新程序的那個程序稱為父程序,新程序稱為子程序,父程序和子程序擁有相同的代碼段資料段,有各自獨立的位址空間。采用寫時拷貝技術,即建立的新程序不會立即把父程序的資源空間複制過來,隻有在修改時才會複制資源,另外父程序挂起的信号和檔案鎖不會被子程序繼承。
子程序結束後,它的父程序要回收它的資源,否則就會成為僵屍程序 。
如果父程序先結束,子程序會被init程序收養,稱為孤兒程序。
終端輸入“ps -el”檢視程序狀态,PID為程序号,PPID為此程序的父程序号,如圖 1.1,1505号程序的父程序為1366程序。
getpid():擷取程序PID,
傳回值為PID号。
fork()
:系統調用,建立一個程序,
#include <unistd.h>
pid_t fork(void);
調用成功父程序傳回子程序号,子程序傳回0,失敗傳回-1。
如以下代碼:
for.c:
列印結果:
程式執行過程中第一次調用fork()程序2531建立子程序2532;第二次fork(),程序2531建立子程序2533,程序2532建立2534,建立過程如圖 1.3: