Linux程序 程序的退出

2021-06-12 17:11:05 字數 1939 閱讀 7362

linux程序-程序的退出

2011-12-27 20:44:56

分類: linux

void _exit(int status)

注意點:

1.status表明了程序終止時的狀態。當子程序使用_exit()後,父程序如果在用wait()等待子程序,那麼wait()將會返回status狀態,注意只有status的低8位(0~255)會返回給父程序。通常,我們使用0,表示程序成功返回,非負值表示程序不成功返回。但是,這種約定不是強制的,每個應用程式都可以自己指定。

2.雖然返回值可以是0~255,但是我們通常使用0~128。因為在shell程式設計中,如果乙個程序被訊號打斷,shell會返回128+訊號編號。在shell中,這兩個值是沒有區別的(都是當做程序返回值),如果我們程序中使用了128~255,那麼就無法區別到底是訊號打斷還是程序自己退出了。

void exit(int status)

注意點:

1.在exit()呼叫後,退出處理函式(exit handler)首先被執行(這些函式使用atexit()和on_exit()註冊)。

2.stdio流緩衝區被重新整理。(還有其他資源的清理)

3.最後一步才是呼叫_exit()退出。

4.在main函式中最後呼叫return n和呼叫exit()是相同的作用。如果在main函式最後呼叫return或不呼叫任何退出函式,呼叫main的執行時函式會自動的呼叫exit(),但是status會變得不確定(在c89中,status可能會是棧中的某個值,或cpu暫存器中的某個值,這要看編譯器是怎麼使用的。在c99中,要求status必須是0)。

註冊退出處理函式

在程式退出之前,我們都會主動地做一些清理的動作,比如把程式緩衝區的資料儲存在檔案上。通常的做法是在exit()之前,呼叫一些清理函式。但這種做法的弊端是,在每個可能退出的地方都寫上一大堆相同的**。另外一種方式就是讓程式中所有可能退出的點,都全部集中在乙個地方處理。這樣做的問題是會出現大量的判斷是否成功語句,讓**顯得不清晰。linux提供了下面的兩個函式來解決這種問題,把所有的清理函式註冊進lib庫中,當任意一處呼叫exit()時,系統會自動的呼叫註冊上的清理函式。

int atexit(void (*func)(void))

注意點:

1.可以註冊多個函式,並且乙個函式也可多次註冊。當要呼叫它們時,是按照filo順序執行的。

2.函式註冊後,沒辦法取消註冊。

3.清理函式中呼叫exit()的行為,在susv3中沒有定義。在linux中,會繼續執行剩下的清理函式。但在某些系統中,可能出現死迴圈。

4.子程序會繼承父程序中的清理函式。

#define _bsd_source

int on_exit(void (*func)(int, void *), void *arg)

注意點:

1. on_exit()是atexit()的改良版。在on_exit()中,可以通過func中的int引數知道exit()的退出狀態;同乙個func可以根據arg的不同,執行不同的**。

2.唯一的缺點是並不是每個系統都實行了改函式。

**分析

int main(

int argc, char *argv)

當在終端執行該程式時,輸出入下:

hello world

cc當把文字輸出到檔案時,檔案中儲存的文字如下:cc

hello world

hello world

分析:當把文字輸出到終端時,stdio函式組是按行輸出。而輸出到檔案時,是按照塊輸出。也就是說,在輸出到檔案時,printf()函式把」hello world\n」前面是因為執行完write()」還在使用者stdio緩衝區中,直到執行了exit(),才把「hello world」重新整理到核心緩衝區中。

Linux程序退出

在linux下,程序退出就表示程序即將結束了 為什麼是即將,這是因為linux設計的是父程序給子程序收屍 正常退出包括3種情形。main函式中執行return 0 呼叫exit函式,函式原型 void exit int status 呼叫 exit函式,函式原型 void exit int stat...

LINUX監視程序退出

arm linux開發 warewin 2g 3g無線傳輸 dtu 和路由器 筆記 監視別的程序的程序,改自busybox的 procps pidof。1 為解決 兩個程序退出導致 web伺服器不能訪問 pppd 不撥號上線,開啟 conpid 程序定期來檢測這兩個程序是否執行。2 該程序編譯到 b...

Linux程序退出碼

include int main void 編譯好,然後執行,然後在shell裡面檢視程序退出碼,鍵入 echo 我們發現拿到的程序退出碼是255。我們返回的明明是 1,為什麼拿到的卻是255呢?還得從程序的狀態碼開始講起,我們知道,當乙個程序退出的時候,父程序一般都會進行收尾工作,就是呼叫wait...