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

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

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

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用

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

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

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

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

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


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

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

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

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

1. 進(jìn)程的開始:

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

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

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

2. 進(jìn)程終止:

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個(gè)函數(shù)的區(qū)別是:

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

3. atexit終止處理程序:

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

原型如下:

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

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

以下面的程序?yàn)槔?

#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; // 相當(dāng)于exit(0) }

運(yùn)行結(jié)果:

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

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

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

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

標(biāo)簽:

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

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

下一篇:Java線程的5個(gè)使用技巧