fork
#include
pid_t fork(void);
//返回值:子程序返回0,父程序返回子程序id;若出錯返回-1
pid_t getpid();
//獲得子程序id
pid_t getppid();
//獲得父程序id
注意
fork之後,父子程序交替執行。
寫時拷貝。
程序被虛擬成檔案: /prev/pid/
ps 檢視程序狀態終止程序ps aux
ps -ef
ctrl + ckill -9 pid kill不能終止僵死程序
終止
5個正常終止條件
(1)在main函式內執行return語句,等效於呼叫exit。
(2)呼叫exit函式。此函式由iso c定義,其操作包括呼叫各終止處理程式(終止處理程式在呼叫atexit函式時登記),然後關閉所有標準i/o流等。因為iso c不處理檔案描述符、多程序以及作業控制,這對unix系統而言是不完整的。
(3)呼叫_exit或_exit函式。iso c定義_exit,其目的是為程序提供一種無需執行終止處理程式或訊號處理程式而終止的方法。對標準i/o流是否沖洗,這取決於實現。在unix系統中_exit和_exit同義。_exit函式由exit函式呼叫,處理unix系統特定的細節。_exit由posix.1說明。
(4)程序的最後乙個執行緒在其啟動例程中執行return語句。但是該執行緒的返回值不作用程序的返回值。程序以終止狀態0返回。
(5)程序的最後乙個執行緒呼叫pthread_exit函式。
3個異常終止條件
(1)呼叫abort。它產生sigabrt訊號,這是下乙個異常終止的特例。
(2)當程序接收到某種訊號時。訊號可由程序自身(如呼叫abort函式)、其他程序或核心產生。例如,若程序引用位址空間之外的儲存單元、或者除以0,核心就會為該程序產生相應的訊號。
(3)最後乙個執行緒對「取消(cancellation)」請求做出響應。預設情況下,「取消」以延遲方式產生:乙個執行緒要求取消另乙個執行緒,若干時間後,目標執行緒終止。
不管程序如何終止,最後都會執行核心中的同一段**。這段**為相應程序關閉所有開啟描述符,釋放它所使用的儲存器等。
#include
int atexit(void (*func)(void));
//返回值:若成功返回0;若失敗返回非0
等待
#include
pid_t wait(int
*statloc);
pid_t waitpid(pid_t pid, int
*statloc, int options);
//兩個函式返回值,若成功返回程序id;若失敗返回0或-1
區別:
(1)在乙個子程序終止前,wait使其呼叫者阻塞,而waitpid有乙個選項,可使呼叫者不阻塞。
(2)waitpid並不等待在其呼叫之後的第乙個終止子程序,它有若干個選項,可以jon告知它所等待的程序。
waitpid函式中pid引數的作用waitpid函式中options引數的作用pid > 0 : 等待程序id等於pid的子程序死亡
pid = 0 : 呼叫者程序所在程序組的任何乙個子程序死亡
pid = -1: 等待任何乙個子程序死亡
pid < -1: |pid|程序組的任何乙個子程序死亡
0wnohang 若由pid指定的子程序並不是立即可用的,則waitpid不阻塞,此時返回值為0
wcontinued 若實現支援作業控制,由pid指定的任一子程序在停止後已經繼續,但其狀態尚未報告,則返回其狀態(posix.1的xsi擴充套件)
wuntraced 若某實現支援作業控制,而由pid指定的任一子程序已處於停止狀態,並且其狀態自停止以來還未報告過,則返回其狀態。wifstopped巨集確定返回值是否對應於乙個停止的子程序。
statloc
兩個函式的引數statloc是乙個整型指標,如果不是空指標,則終止程序的終止狀態儲存在該指標指向的單元內。如果不關心終止狀態可以指定為空指標。
巨集: wifsignaled(status) ————如果被訊號打斷退出,返回真
wifexited(status) ————如果正常退出,返回真
wtermsig(status) ————如果被訊號打斷,返回訊號值
wexitstatus(status) ————如果正常退出,得到退出碼
linux 程序控制
什麼是程序 每乙個程序在系統中都有唯一的id標示它,此id為程序標示符 程序標示符的型別 pit t,其實是乙個無符號整形 乙個程序標示符對應唯一的乙個程序,多個程序標示符可以對應同乙個程式 程序和程式的區別 程式 可執行的二進位制 檔案,這種檔案載入到記憶體中執行就得到了乙個程序 程序 同乙個程式...
Linux程序控制
linux程序控制 獲取pid include include pid t getpdi void 獲取本程序id pdi t getppid vodi 獲取父程序id,及獲取建立子程序的程序id 程序建立 include pid t fork void 建立子程序 呼叫一次返回兩次值 1.父程序中...
linux程序控制
linux程序控制 編寫命令直譯器 一 背景 之前在 計算機作業系統 這本書中已經多次接觸了程序這一概念,而程序在作業系統中具體是做什麼的呢?卻沒有實際的與程序發生過互動,因此也就沒有實際的感受。對於我來說程序僅僅停留在概念的層面上 程序是程式執行時的記憶體空間和設定或者說程序就是程式的進行時。沒有...