程序的退出方式以及殭屍程序和孤兒程序

2021-10-09 15:03:57 字數 2626 閱讀 7387

(1)正常退出

檢查wait和waitpid所返回的終止狀態的巨集巨集

說明wifexited(status)

若為正常終止子程序返回的狀態,則為真。對於這種情況可執行wexitstatus(status),取子程序傳送給exit、_exit或_exit引數的低8位

wifsignaled(status)

若為異常終止子程序返回的狀態,則為真(接到乙個不捕捉的訊號)。對於這種情況,可執行wtermsig (status),取使子程序終止的訊號編號。另外,有些實現(非single unix specification)定義巨集wcoredump (staus),若已產生終止程序的core檔案,則它返回真

wifstopped(status)

若為當前暫停子程序的返回的狀態,則為真。對於這種情況,可執行wstopsig(status),取使子程序暫停的訊號編號

wifcontinued(status)

若在作業控制暫停後已經繼續的子程序返回了狀態,則為真。(posix.1的xsi擴充套件,僅用於waitpid.)

(3)父程序等待子程序退出

pid_t wait

(int

*status)

;解析子程序返回的狀態碼

status是乙個整形數指標

空: 不關心退出狀態

子程序狀態不被收集會變成殭屍程序

殭屍程序:當子程序比父程序先結束,而父程序又沒有**子程序,釋放子程序占用的資源,此時子程序將成為乙個殭屍程序。如果父程序先退出 ,子程序被init接管,子程序退出後init會**其占用的相關資源。

怎麼檢視殭屍程序:利用命令ps,可以看到有父程序id為1的程序是孤兒程序;s(state)狀態為z的是殭屍程序。

注意:孤兒程序(orphan process)是尚未終止但已停止(相當於前台掛起)的程序,但其父程序已經終止,由init收養;而殭屍程序則是已終止的程序,其父程序不一定終止。

status為null的**示例

#include

#include

#include

#include

#include

intmain()

}else

if(pid==0)

}}return0;

}

status不為空的**示例

#include

#include

#include

#include

#include

intmain()

}else

if(pid==0)

}}return0;

}

waitpid函式

pid_t waitpid

(pid_t pid,

int*status,

int options)

;

對於waitpid函式中的pid引數的作用解釋如下:

pid==-1 等待任意子程序,就這一方面而言,wait與waitpid等效。

pid>0 等待其程序id與pid相等的子程序。

pid==0 等待其組id等於呼叫程序組id的任一子程序

pidwaitpid的options常量常量

說明wcontinued

若實現支援作業控制,那麼由pid指定的任一子程序在暫停後已經繼續,但其狀態尚未報告,則返回其狀態(posix.1的xsi擴充套件)。

wnohang(常用,不掛起,不堵塞)

如果pid指定的子程序沒有結束,則waitpid()函式立即返回0,而不是阻塞在這個函式上等待;如果結束了,則返回該子程序的程序號。

wuntraced

若某實現支援作業控制,而由pid指定的任一子程序已處於暫停狀態,並且其狀態自暫停以來還未報告過,則返回其狀態。wifstopped巨集確定返回值是否對應於乙個暫停子程序。如果子程序進入暫停狀態,則馬上返回。

如果不想使用這些選項,則可以把這個引數設為0。

如果像這樣呼叫waitpid函式:waitpid(-1, status, 0),這此時waitpid()函式就完全退化成了wait()函式。

**示例

#include

#include

#include

intmain()

}else

if(pid==0)

}}return0;

}

程序退出方式

程序退出分為正常退出和異常退出兩種 1 正常退出 a.在main函式中執行return b.呼叫exit函式 c.呼叫 exit函式 2 異常退出 a.呼叫about函式。b.程序受到某個訊號,而該訊號使程式終止。總結 不管是那種退出方式,最終都會執行核心中的同一段 這段 用來關閉程序中所有開啟的檔...

LINUX程序和執行緒 通訊以及退出方式

可能涉及概念 程序 系統進行資源分配和排程的基本單位 執行緒 程式執行流的最小單元,輕量級程序 單工 類似高速公路中的單車道 只往乙個方向,收或者發 半雙工 類似單通道的普通馬路,一時間只允許一輛車 和單工比起來可以切換方向 全雙工 如同高速公路,每個裝置都可以收發 通訊方式 程序間通訊 7種 管道...

孤兒程序與殭屍程序的區別以及殭屍程序的解決方案

正常情況下,子程序由父程序建立,父子程序是乙個非同步過程,子程序結束之後父程序一般會呼叫wait 或者waitpid 取得子程序的終止狀態,然後 子程序的資源。孤兒程序 父程序結束了,但是他的乙個或者多個子程序還在執行,那麼這些子程序就變成了孤兒程序 father died 子程序的資源由init程...