1. 程式人生 > >exit 和_exit 的區別與聯絡

exit 和_exit 的區別與聯絡

exit 和_exit 函式用於正常終止一個程式;

_exit 立即進入核心,exit 則先執行一些清除處理(包括呼叫執行各終止處理程式,關閉所有標準I / O 流等),然後進入核心。


_exit()立即進入,printf輸出的內部可能還在緩衝區裡,未作清理,就進入核心,執行程序退出,這樣你後面一個輸出就可能未能輸出到螢幕

exit和_exit函式都是用來終止程序的。當程式執行到exit或_exit時,系統無條件的停止剩下所有操作,清除包括PCB在內的各種資料結構,並終止本程序的執行。但是,這兩個函式是有區別的。

exit()函式的作用是:直接使用程序停止執行,清除其使用的記憶體空間,並清除其在核心中的各種資料結構;exit()函式則在這一基礎上做了一些包裝。在執行退出之前加了若干道工序。exit()函式與_exit()函式最大區別就在於exit()函式在呼叫exit系統之前要檢查檔案的開啟情況,把檔案緩衝區的內容寫回檔案。

由於Linux的標準函式庫中,有一種被稱作“緩衝I/O”的操作,其特徵就是對應每一個開啟的檔案,在記憶體中都有一片緩衝區。每次讀檔案時,會連續的讀出若干條記錄,這樣在下次讀檔案時就可以直接從記憶體的緩衝區讀取;同樣,每次寫檔案的時候也僅僅是寫入記憶體的緩衝區,等滿足了一定的條件(如達到了一定數量或遇到特定字元等),再將緩衝區中的內容一次性寫入檔案。

這種技術大大增加了檔案讀寫的速度,但也給程式設計代來了一點兒麻煩。比如有一些資料,認為已經寫入了檔案,實際上因為沒有滿足特定的條件,它們還只是儲存在緩衝區內,這時用_exit()函式直接將程序關閉,緩衝區的資料就會丟失。因此,要想保證資料的完整性,就一定要使用exit()函式。

Exit的函式宣告在stdlib.h標頭檔案中。

_exit的函式宣告在unistd.h標頭檔案當中。

下面的例項比較了這兩個函式的區別。printf函式就是使用緩衝I/O的方式,該函式在遇到“\n”換行符時自動的從緩衝區中將記錄讀出。例項就是利用這個性質進行比較的。

exit.c原始碼

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    printf("Using exit...\n");
    printf("This is the content in buffer");
    exit(0);
}

輸出資訊:

Using exit...

This is the content in buffer

#include <unistd.h>
#include <stdio.h>

int main(void)
{
    printf("Using exit...\n");
    printf("This is the content in buffer");
    _exit(0);
}

則只輸出:

Using exit...

說明:在一個程序呼叫了exit之後,該程序並不會馬上完全小時,而是留下一個稱為殭屍程序(Zombie)的資料結構。殭屍程序是一種非常特殊的程序,它幾乎已經放棄了所有的記憶體空間,沒有任何可執行程式碼,也不能被排程,僅僅在程序列表中保留一個位置,記載該程序的退出狀態等資訊供其它程序收集,除此之外,殭屍程序不再佔有任何記憶體空間


abort()使程式異常退出,exit()可以有傳入值。 

--------------------------------------------------------------- 
abort writes a termination message on stderr ("Abnormal program 
termination"), then aborts the program by a call to _exit with exit code 3. 

exit terminates the calling process. Before termination, exit does the 
following: 
closes all files 
writes buffered output (waiting to be output) 
calls any registered "exit functions" (posted with atexit) 
--------------------------------------------------------------- 
exit()可以指定退出的狀態,正常或者出錯。 
abort()好像只是退出程式而已。 
--------------------------------------------------------------- 
exit()退出前先要執行vatexit()設定的函式 
abort()使程式非正常退出 
--------------------------------------------------------------- 

abort()僅僅使程式退出,啥也不做. 
exit()在退出前要做一些清理工作. 
--------------------------------------------------------------- 
在華中科技大學《C++程式設計實踐教程》中,談到這一區別: 
按面向物件的思想,程式也是一個物件,因此,程式也有生有死。 
C++在編譯一個程式後,這樣執行程式:(1)執行開工函式,此時對 
程式初始化,主要指全域性變數初始化。(2)呼叫main函式。(3)執行 
收工函式,對全域性變數(物件)進行析構。所以如下程式會有輸出, 
儘管main函式為空: 
#include <stdio.h> 
int  x=printf("ABCDEF"); 
void main( ){ } 
現在,來談abort和exit以及return的區別。return返回,可析構 
main或函式中的區域性變數,尤其要注意區域性物件,如不析構可能造成 
記憶體洩露。exit返回不析構main或函式中的區域性變數,但執行收工函式, 
故可析構全域性變數(物件)。abort不析構main或函式中的區域性變數,也不 
執行收工函式,故全域性和區域性物件都不析構。 
所以,用return更能避免記憶體洩露,在C++中用abort和exit都不是好 
習慣。 
請給分。 
--------------------------------------------------------------- 

exit() 
Terminate the calling process after cleanup (exit) or immediately (_exit). 
abort() 
Aborts the current process and returns an error code

____________________________________________________________

 #include <stdlib.h>

exit_exit函式用於正常終止一個程式: _exit立即進入核心,exit則先執行一些清除處理(包括呼叫執行各終止處理程式,關閉所有標準I / O流等),然後進入核心。使用不同標頭檔案的原因是:exit是由ANSI C說明的,而_exit則是由POSIX.1說明的。
       由於歷史原因,exit函式總是執行一個標準I/O庫的清除關閉操作:對於所有開啟流呼叫 fclose 函式。exit_exit都帶一個整型引數,稱之為終止狀態(exit status)。大多數UNIX shell都提供檢查一個程序終止狀態的方法。如果( a )若呼叫這些函式時不帶終止狀態,或( b ) main執行了一個無返回值的re turn語句,或( c ) main執行隱式返回,則該程序的終止狀態是末定義的。這就意味著,下列經典性的C語言程式:
             #include <stdio.h>
             main ()
             {
                      printf ("hello, world /n");
             }
       是不完整的,因為main函式沒有使用return語句返回(隱式返回),它在返回到C的起動例程時並沒有返回一個值(終止狀態)。另外,若使用:
               return( 0 ) ;或者
               exit( 0 );
        則向執行此程式的程序(常常是一個shell程序)返回終止狀態0。另外,main函式的說明實際上應當是:
                                             int main(void)
       將main說明為返回一個整型以及用exit代替return,對某些C編譯程式和UNIX lint(1)程式而言會產生不必要的警告資訊,因為這些編譯程式並不瞭解main中的exit與return語句的作用相同。警告資訊可能是“ control reaches end of nonvoid function(控制到達非void函式的結束處)”。避開這種警告資訊的一種方法是:在main中使用return語句而不是exit。但是這樣做的結果是不能用UNIX的grep公用程式來找出程式中所有的exit呼叫。另外一個解決方法是將main說明為返回void而不是int,然後仍舊呼叫exit。這也避開了編譯程式的警告,但從程式設計角度看卻並不正確。本章將main表示為返回一個整型,因為這是ANSIC和POSIX.1所定義的。我們將不理會編譯程式不必要的警告


相關推薦

Filter、ServletListener區別聯絡

1. Servlet 可以用來建立並返回一個包含基於客戶請求性質的動態內容的完整的html頁面;可以建立可嵌入到現有的html頁面中的一部分html頁面(html片段);可以讀取客戶端發來的隱藏資料;可以 讀取客戶端發來的顯示資料;可以與其他伺服器資源(包括資料庫和jav

exit _exit區別聯絡

exit 和_exit 函式用於正常終止一個程式; _exit 立即進入核心,exit 則先執行一些清除處理(包括呼叫執行各終止處理程式,關閉所有標準I / O 流等),然後進入核心。 _exit()立即進入,printf輸出的內部可能還在緩衝區裡,未作清理,就進入核心,執

linux程序退出的時exit_exit區別聯絡

一,程序終止有5種方式: 正常退出: 從main函式返回呼叫exit呼叫_exit 異常退出: 呼叫abort由訊號終止 二,exit和_exit區別: 關於_exit():        #include <unistd.h>        void _exit(int stat

OpenJDKSun/OracleJDK 區別 聯絡

首先要先明確之間,以及OpenJDK 6、OpenJDK 7、OpenJDK 7u和OpenJDK 8等專案之間是什麼關係,這有助於確定接下來編譯要使用的JDK版本和原始碼分支。 從前面介紹的Java發展史中我們瞭解到OpenJDK是Sun在2006年末把Java開源而形成的專案,這裡的

叢集分散式相關概念的區別聯絡

先說區別: 一句話:分散式是並聯工作的,叢集是串聯工作的。 1:分散式是指將不同的業務分佈在不同的地方。 而叢集指的是將幾臺伺服器集中在一起,實現同一業務。 分散式中的每一個節點,都可以做叢集。 而叢集並不一定就是分散式的。 舉例:就比如新浪網,訪問的人多了,他可以做一個群集,前面放一個響應伺服器,

Linux可重入函式執行緒安全的區別聯絡(轉)

*****可重入函式      函式被不同的控制流程呼叫,有可能在第一次呼叫還沒返回時就再次進入該函式,這稱為重入。      當程式執行到某一個函式的時候,可能因為硬體中斷或者異常而使得在使用者正在執行的程式

python3的evalexec的區別聯絡

eval:  可以把字串裡的字元轉換為可執行程式碼,但只支援一行字元。可以返回執行後得到的值。如下: f = "3+6+9+8" s = eval(f) print(s) 輸出: "C:\Program Files\python3\python3.exe" D:/co

pandas中Series()DataFrame()的區別聯絡

區別: series,只是一個一維資料結構,它由index和value組成。 dataframe,是一個二維結構,除了擁有index和value之外,還擁有column。 聯絡: dataframe由多個series組成,無論是行還是列,單獨拆分出來都是一個series。 程式碼演示:

Python的例項方法、類方法靜態方法之間的區別聯絡

Python的例項方法、類方法和靜態方法 class Test: def test1(self): print('test......') @classmethod def test2(cls): print('test2......c

簡述COOKIESESSION的區別聯絡

cookie 和session 的區別:1、cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session。3、session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺

空三匹配密集匹配的區別聯絡

很多人包括一些業內人士都不清楚空三匹配(空中三角測量中的連線點匹配,亦即計算機視覺中的SFM演算法中的同名點匹配,比如SIFT演算法)和密集匹配(也叫立體匹配,立體對應或稠密匹配)有什麼區別,於是經常會問諸如下列問題: 1. 做空三匹配的時候做的密集一點就是密集匹配了吧? 2. 空

詳談getpost的區別聯絡

Http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查,改,增,刪4個操作。到這裡,大家應該有個大概

exit() _exit() 的區別

exit()和_exit()的效果都是讓程式退出執行,而_exit()用來“儘快”退出。   atexit() 先說一下atexit()函式。我們可以用atexit()註冊一個或多個函式退出清理函式(或者on_exit()但這個函式不建議用),這些清理函式按照註冊時的反順序,在

資料倉庫資料集市的概念、區別聯絡

1.為什麼會出現資料倉庫和資料集市?     “資料倉庫”的概念可以追溯到80 年代中期。從本質上講,最初資料倉庫是想為操作型系統到決策支援環境的資料流提供一種體系結構模型,並嘗試解決和這些資料流相關的各種問題。     在缺乏“資料倉庫”體系結構的情

java提高篇——內部類外部類的區別聯絡

定義在一個類內部的類叫內部類,包含內部類的類稱為外部類。 連結:https://www.cnblogs.com/aademeng/articles/6192954.html https://www.cnblogs.com/yzssoft/p/7156809.html http://www.

golang中陣列切片的區別聯絡

golang中陣列和切片的區別: 切片時指標型別,陣列是值型別 陣列的長度是固定的,而切片不是(切片是動態的陣列) 切片比陣列多一個屬性:容量(cap) 切片的底層是陣列 既然一個是指標型別,一個是

SessionCookie的區別聯絡

一、會話的概念    會話就好比打電話,一次通話可以理解為一次會話。我們登入一個網站,在一個網站上不同的頁面瀏覽,最後退出這個網站,也是一個會話。一個網站對於不同的使用者會展示出不同的頁面資訊,但是在HTTP協議中,客戶端請求服務端是一種無狀態的連線-每次請求都

C++指標引用的區別聯絡

1.指標和引用的定義和性質區別: (1)指標是一個變數,只不過這個變數儲存的是一個地址,指向記憶體的一個儲存單元;     而引用跟原來的變數實質上是同一個東西,只不過是原變數的一個別名而已。 (2)可以有const指標,常量指標可以改變指向,指標常量

Linux系統程式設計——程序執行緒的區別聯絡

在許多經典的作業系統教科書中,總是把程序定義為程式的執行例項,它並不執行什麼, 只是維護應用程式所需的各種資源,而執行緒則是真正的執行實體。 為了讓程序完成一定的工作,程序必須至少包含一個執行緒。 程序,直觀點說,儲存在硬碟上的程式執行以後,會在記憶體空間裡形成

jsonpython中的字典的區別聯絡

json: json是一種資料的表現形式,是一種資料格式:比如在ajax中的資料接收型別,一般都是json型別的資料格式,也會有txt的資料格式;如下程式碼所示: $.ajax({ url: '/change_data', type: 'GET'