中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

引用 exit、return、_exit、_Exit這幾個函數(shù)的區(qū)別

2018-07-20    來源:編程學習網(wǎng)

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

一、exit函數(shù)和return函數(shù)的主要區(qū)別是:

  1. exit用于在程序運行的過程中隨時結(jié)束程序,其參數(shù)是返回給OS的。也可以這么講:exit函數(shù)是退出應(yīng)用程序,并將應(yīng)用程序的一個狀態(tài)返回給OS,這個狀態(tài)標識了應(yīng)用程序的一些運行信息。

    main函數(shù)結(jié)束時也會隱式地調(diào)用exit函數(shù),exit函數(shù)運行時首先會執(zhí)行由atexit()函數(shù)登記的函數(shù),然后會做一些自身的清理工作,同時刷新所有輸出流、關(guān)閉所有打開的流并且關(guān)閉通過標準I/O函數(shù)tmpfile()創(chuàng)建的臨時文件。

    exit是系統(tǒng)調(diào)用級別的,它表示了一個進程的結(jié)束,它將刪除進程使用的內(nèi)存空間,同時把錯誤信息返回父進程。通常情況:exit(0)表示程序正常, exit(1)和exit(-1)表示程序異常退出,exit(2)表示系統(tǒng)找不到指定的文件。

  2. return是語言級別的,它表示了調(diào)用堆棧的返回;return是返回函數(shù)值并退出函數(shù),通常0為正常退出,非0為非正常退出,請注意,如果是在主函數(shù)main, 自然也就結(jié)束當前進程了(也就是說,在main()里面,你可以用return n,也能夠直接用exit(n)來做),如果不是在main函數(shù)中,那 就是退回上一層調(diào)用。在多個進程時,如果有時要檢測上個進程是否正常退出,就要用到上個進程的返回值。


二、進程環(huán)境與進程控制

如果exit(int n)是在main函數(shù)里被調(diào)用的,那么exit(int n)就直接退出程序,并返回一個int型的值。一般在shell下面,運行一個程序,然后使用命令echo $?就能得到該程序的返回值,也就是退出值。理論上exit可以返回小于256的任何整數(shù),返回的不同數(shù)值主要是給調(diào)用者作不同處理的。

對于單獨的進程exit的返回值是返回給操作系統(tǒng)的,但如果是多進程,則是返回給父進程的。父進程里面調(diào)用waitpid()等函數(shù)得到子進程退出的狀態(tài),以便作不同處理。根據(jù)相應(yīng)的返回值來讓調(diào)用者作出相應(yīng)的處理。

總的說來,exit(int n)就是當前進程把其控制權(quán)返回給調(diào)用該子程序的主程序, 括號里的是返回值,告訴調(diào)用程序該程序的運行狀態(tài)。

1. 進程的開始:

C程序是從main函數(shù)開始執(zhí)行, 原型如下:

int main(int argc, char *argv[]);

通常main的返回值是int型, 正確返回0。

2. 進程終止:

C程序的終止分為兩種: 正常終止和異常終止。

正常終止分為: return, exit, _exit, _Exit, pthreade_exit。

異常中指分為: abort, SIGNAL, 線程響應(yīng)取消。

主要說一下正常終止的前4種, 即exit系列函數(shù).

#include <stdlib.h> void exit(int status); void _Exit(int status); #include <unistd.h> void _exit(int status);

以上3個函數(shù)的區(qū)別是:

exit()(或return 0)會調(diào)用終止處理程序和用戶空間的標準I/O清理程序(如fclose), 而 _exit和_Exit不調(diào)用而直接由內(nèi)核接管進行清理。因此, 在main函數(shù)中exit(0)等價于return 0。

3. atexit終止處理程序:

ISO C規(guī)定, 一個進程最多可登記32個終止處理函數(shù), 這些函數(shù)由exit按登記相反的順序自動調(diào)用。如果同一函數(shù)登記多次, 也會被調(diào)用多次。

原型如下:

#include <stdlib.h> int atexit(void (*func)(void));

其中參數(shù)是一個函數(shù)指針, 指向終止處理函數(shù), 該函數(shù)無參無返回值。atexit函數(shù)本身成功調(diào)用后返回0。

以下面的程序為例:

#include <stdlib.h> static void myexit1()
{ printf("first exit handlern");
} static void myexit2()
{ printf("second exit handlern");
} int main()
{
	atexit(my_exit2);
	atexit(my_exit1);
	atexit(my_exit1); printf("main is donen"); return 0; // 相當于exit(0) }

運行結(jié)果:

$ ./a.out
main is done first exit handler first exit handler second exit handler

main函數(shù)結(jié)束時也會隱式地調(diào)用exit函數(shù),exit函數(shù)運行時首先會執(zhí)行由atexit()函數(shù)登記的函數(shù),然后會做一些自身的清理工作,同時刷新所有輸出流、關(guān)閉所有打開的流并且關(guān)閉通過標準I/O函數(shù)tmpfile()創(chuàng)建的臨時文件。

注意上面程序的結(jié)果,可以發(fā)現(xiàn)這些函數(shù)由exit按登記相反的順序自動調(diào)用(先myexit1后myexit2)。如果同一函數(shù)登記多次, 也會被調(diào)用多次(如這里的myexit1)。

而這些處理函數(shù)都是在程序退出的時候利用atexit函數(shù)調(diào)用了這些處理函數(shù)。但是如果用_exit()退出程序,則它不關(guān)閉任何文件,不清除任何緩沖器、也不調(diào)用任何終止函數(shù)!

標簽:

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:Android反編譯:反編譯工具和方法

下一篇:Java線程的5個使用技巧