Linux系統呼叫 程序的終止

2021-07-15 12:11:04 字數 2485 閱讀 4521

之前介紹了linux的系統建立,主要是fork()函式和vfork()函式,現在再看看linux程序的終止,主要的呼叫是_exit()和exit().

先看看兩個函式的原型以及各自屬於的標頭檔案,可以發現這兩個方法的區別

_exit()函式:

#include void _exit(int status);

從_exit()的標頭檔案能夠發現,_exit()是屬於linux的系統呼叫, 只能在linux或者是unix上才支援這個呼叫。

其中,status定了程序的終止狀態,其父程序可以通過wait()函式來獲取這個狀態,從而進行之後的執行操作。當status為0時,表示程序正常退出,反之則是非正常退出。呼叫_exit()會使程序總是成功終止,也就是說_exit()方法從不會返回。

此處需要注意的是,雖然status定義成了整型,但實際上只有低8位可用,其原因就是當以訊號(signal)終止乙個程序的時候,shell會將變數$?置為128與訊號之和,以表徵這一事實。如果這與程序呼叫_exit()時所使用相同status值混雜起來,將令shell無法分辨。(這個地方不是很理解)

exit()函式:

#include void exit(int status);

從exit()的標頭檔案可以看出,exit()是c語言的庫函式,所以所有的c語言都支援這個方法。

exit()在呼叫的時候要做得工作會比較多,主要有如下幾個操作:

呼叫退出處理程式(通過atexit()和on_exit()註冊的函式),並且在有多個退出處理程式時,執行順序與註冊順序相反。

重新整理stdio流緩衝區;

使用有status提供的值執行_exit()函式

我們通常在寫程式的時候,在main()函式結尾只是用了return n;來結尾,在這個地方,return n; 就相當於exit(n),在結束的時候主函式會將返回值作為呼叫exit()函式的引數。這個地方本人有個疑問,在exit()函式呼叫_exit()時,其引數使用前面的n,而在_exit(int status)中,status為0表示程式正常結束,如果在return的時候,指定的n不為0,是乙個其他的數,linux內部會怎麼處理呢?

其實在程序終止的時候,還有一些更細緻的操作,由於本人目前能力有限,先不做討論。

剛剛在前面提到了退出處理程式,現在來看看退出處理程式。

#include int atexit(void (*func)(void));

//退出處理函式的定義

void func(void)

需要注意的是:

atexit()函式在出錯的時候返回的是非0值,不僅僅是負值;

同時,在退出處理函式中如果訪問了此前mian()函式中本地變數,那麼main()函式的返回會導致未定義的行為;

當有多個退出處理程式的時候,退出處理程式的呼叫順序與之策順序是相反的,這一點的邏輯是,先註冊的通常是更為基本的清理動作,可能需要在後續註冊的函式後再執行;

一旦退出處理程式在無法返回——呼叫了_exit()或者因為訊號而終止,其後的處理程式將不再執行。

以上的atexit()有兩個侷限,第一是退出處理程式不能獲取當前程序退出時的狀態,而根據程序退出狀態來做相應的操作可以是支援的;第二就是不能給退出處理程式傳遞引數。

所以glibc提供了乙個非標準的替代方法:on_exit()。其定義如下:

#define _bsd_source

#include int on_exit(void (*func)(int, void *),void *arg);

//退出處理函式定義

void func(int status, void *arg)

和atexit()函式類似,on_exit()的出錯時返回值為非0。而on_exit()還不是所有標準都支援,還是應該盡量避免。

atexit()和on_exit()註冊的函式屬於同乙個函式列表,在執行時與註冊的順序相反。

#define _bsd_source

#include #include #include static void atexitfunc1(void)

static void atexitfunc2(void)

static void onexitfunc(int exitstatus, void *arg)

int main(int argc, char *argv)

執行的結果如下:

on_exit function called: status=2, arg=20

atexit function 2 called

atexit function 1 called

on_exit function called: status=2, arg=10

由於剛開始學習linux不久,有些理解可能有問題,希望各位大神多多海涵,希望和大家多交流

Linux系統呼叫 建立和終止程序

1.程序的三種狀態 1.執行。要麼在被cpu執行,要麼等待被執行且最終會被核心排程。2.停止。執行被掛起且不會被排程。收到特定訊號後才能繼續執行。3.終止。程序永遠地停止了。可能的原因有三種 1 收到終止程序的訊號,2 從主程式返回,3 呼叫exit函式 2.終止程序 includevoid exi...

Linux 程序建立 程序終止

程序終止 fork 在linux中fork函式時非常重要的函式,它從已存在程序中建立乙個新程序。新程序為子程序,而原程序為父程序。include pid t fork void 返回值 自程序中返回0,父程序返回子程序id,出錯返回 1子程序複製父程序的pcb,因此複製了父程序的程式計數器,所以和父...

LINUX 終止程序的執行

問題 1 執行 sleep 600 命令 2 再開乙個終端,查出sleep程式的pid並殺死 3 執行多個xsnow程式並都放入後台 4 殺死所有xsnow程序 5 su切換為zhangsan使用者 6 再開乙個終端,強制踢出zhangsan使用者 方案殺死程序的命令一般有kill killall ...