C語言中exit()與return的區別


1、exit函數和return函數的主要區別是:

1)exit用於在程序運行的過程中隨時結束程序,exit的參數是返回給OS的。main函數結束時也會隱式地調用exit函數。exit函數運行時首先會執行由atexit()函數登記的函數,然后會做一些自身的清理工作,同時刷新所有輸出流、關閉所有打開的流並且關閉通過標准I/O函數tmpfile()創建的臨時文件。exit是結束一個進程,它將刪除進程使用的內存空間,同時把錯誤信息返回父進程;而return是返回函數值並退出函數。通常情況:exit(0)表示程序正常, exit(1)和exit(-1)表示程序異常退出,exit(2)表示表示系統找不到指定的文件。在整個程序中,只要調用exit就結束(當前進程或者在main時候為整個程序)。
2)return是語言級別的,它表示了調用堆棧的返回;return( )是當前函數返回,當然如果是在主函數main, 自然也就結束當前進程了,如果不是,那就是退回上一層調用。在多個進程時。如果有時要檢測上個進程是否正常退出。就要用到上個進程的返回值,依次類推。而 exit是系統調用級別的,它表示了一個進程的結束
3)exit函數是退出應用程序,並將應用程序的一個狀態返回給OS,這個狀態標識了應用程序的一些運行信息。
4)和機器和操作系統有關的一般是: 0為正常退出,非0為非正常退出;

2、進程環境與進程控制

exit(int n)其實就是直接退出程序,因為默認的標准程序入口為 int main(int argc, char** argv),返回值是int型的。一般在shell下面,運行一個程序,然后使用命令echo $?就能得到該程序的返回值,也就是退出值,在main()里面,你可以用return n,也能夠直接用exit(n)來做。unix默認的正確退出是返回0,錯誤返回非0。理論上exit可以返回小於256的任何整數。返回的不同數值主要是給調用者作不同處理的。
單獨的進程是返回給操作系統的。如果是多進程,是返回給父進程的。父進程里面調用waitpid()等函數得到子進程退出的狀態,以便作不同處理。根據相應的返回值來讓調用者作出相應的處理。總的說來 ,exit()就是當前進程把控制權返回給調用該程序的程序,括號里的是返回值,告訴調用程序該程序的運行狀態

1)進程的開始:

C程序是從main函數開始執行,原型如下:

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

通常main的返回值是int型,正確返回0。如果main的返回值為void,某些編譯器會給出警告,此時main的返回值通常是0。

2)進程終止:

C程序的終止分為兩種:正常終止和異常終止。
正常終止分為:return,exit,_exit,_Exit,pthreade_exit。異常中指分為:abort,SIGNAL,線程響應取消。
主要說一下正常終止的前4種:即exit系列函數。

#include <stdlib.h>  

void exit(int status);
void _Exit(int status);



#include <unistd.h>   

void _exit(int status);

以上3個函數的區別是:exit()(或return 0)會調用終止處理程序和用戶空間的標准I/O清理程序(如fclose),_exit和_Exit不調用而直接由內核接管進行清理。因此,在main函數中exit(0)等價於return 0。

3)atexit終止處理程序:

ISO C規定,一個進程最多可登記32個終止處理函數,這些函數由exit按登記相反的順序自動調用。如果同一函數登記多次,也會被調用多次。
原型如下:

 #include <stdlib.h>

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

其中參數是一個函數指針,指向終止處理函數,該函數無參無返回值。atexit函數本身成功調用后返回0。
以下面的程序為例:


#include<stdio.h>
#include <stdlib.h>
static void myexit1()  
{  
     printf("first exit handler\n");  
}  
static void myexit2()  
{  
     printf("second exit handler\n");  
}  
int main()  
{  
     atexit(my_exit2);  
     atexit(my_exit1);   
     atexit(my_exit1);  
     printf("main is done\n");  
     return 0;  
}  

運行結果:

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

注意上面的結果,可以發現這些函數由exit按登記相反的順序自動調用(先myexit1后myexit2)。如果同一函數登記多次, 也會被調用多次(如這里的myexit1)。程序退出的時候利用atexit函數調用了這些處理函數。但是如果用_exit()退出程序,則它不關閉任何文件,不清除任何緩沖器、也不調用任何終止函數!

轉自 https://www.cnblogs.com/noble/p/4144166.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM