程序就好比人一樣有其生命,我們通過fork()函式來建立乙個程序,那麼我們又是如何來中止程序呢。
程序退出
1.在linux中任何讓乙個程序退出
程序退出表示程序即將結束。在linux中程序退出分為了正常退出和異常退出兩種。
1>正常退出
a. 在main()函式中執行return 。
b.呼叫exit()函式
c.呼叫_exit()函式
2>異常退出
a.呼叫about函式
b.程序收到某個訊號,而該訊號使程式終止。
tiger-john說明:
不管 是那種 退出方式,系統最終都會執行核心中的同一**。這段**用來關閉程序所用已開啟的檔案描述符,釋放它所占用的記憶體和其他資源。
3>比較以上幾種退出方式的不同點
(1)exit和return 的區別:
a.exit是乙個函式,有引數。exit執行完後把控制權交給系統
b.return是函式執行完後的返回。renturn執行完後把控制權交給呼叫函式。
(2)exit和abort的區別:
a.exit是正常終止程序
b.about是異常終止。
現在我們重點了解exit()和_exit()函式
2.exit()和_exit()的學習
1>exit和_exit函式都是用來終止程序的。
當程式執行到exit或_exit時,系統無條件的停止剩下所有操作,清除包括pcb在內的各種資料結構,並終止本程序的執行。
2>exit在標頭檔案stdlib.h中宣告,而_exit()宣告在標頭檔案unistd.h中宣告。 exit中的引數exit_code為0代表程序正常終止,若為其他值表示程式執行過程中有錯誤發生。
3>exit()和_exit()的區別:
a._exit()執行後立即返回給核心,而exit()要先執行一些清除操作,然後將控制權交給核心。
b. 呼叫_exit函式時,其會關閉程序所有的檔案描述符,清理記憶體以及其他一些核心清理函式,但不會重新整理流(stdin, stdout, stderr ...). exit函式是在_exit函式之上的乙個封裝,其會呼叫_exit,並在呼叫之前先重新整理流。
tiger-john說明:
exit()函式與_exit()函式最大區別就在於exit()函式在呼叫exit系統之前要檢查檔案的開啟情況,把檔案緩衝區的內容寫回檔案。由於linux的標準函式庫中,有一種被稱作「緩衝i/o」的操作,其特徵就是對應每乙個開啟的檔案,在記憶體中都有一片緩衝區。每次讀檔案時,會連續的讀出若干條記錄,這樣在下次讀檔案時就可以直接從記憶體的緩衝區讀取;同樣,每次寫檔案的時候也僅僅是寫入記憶體的緩衝區,等滿足了一定的條件(如達到了一定數量或遇到特定字元等),再將緩衝區中的內容一次性寫入檔案。這種技術大大增加了檔案讀寫的速度,但也給程式設計代來了一點兒麻煩。比如有一些資料,認為已經寫入了檔案,實際上因為沒有滿足特定的條件,它們還只是儲存在緩衝區內,這時用_exit()函式直接將程序關閉,緩衝區的資料就會丟失。因此,要想保證資料的完整性,就一定要使用exit()函式。
c . 通過乙個函式例項來看看它們之間的區別:
函式例項1 : exit.c
1 #include
2 #include
3 4 int main()
5 函式經過除錯後
think@ubuntu:~/work/process_thread/exit$ gcc exit.c -o exit
think@ubuntu:~/work/process_thread/exit$ ./exit
執行結果為:
using exit----
this is the content in buffer
函式例項2:_exit.c
1 #include
2 #include
3 4 int main(void)
5 函式經過除錯後
think@ubuntu:~/work/process_thread/exit$ gcc _exit.c -o _exit
think@ubuntu:~/work/process_thread/exit$ ./_exit
執行結果為 :
using _exit--
tiger-john說明:
1.printf函式就是使用緩衝i/o的方式,該函式在遇到「\n」換行符時自動的從緩衝區中將記錄讀出。所以exit()將緩衝區的資料寫完後才退出,而_exit()函式直接退出。
2.大家也可以把函式例項2中的printf("this is the content in buffer");改為printf("this is the content in buffer\n")(即在printf中最後加乙個\n看執行結果是什麼,為什麼會產生這樣的結果呢?)
tiger-john補充:
父子程序終止的先後順序不同會產生不同的結果。
1>父程序先於子程序終止:
此種情況就是我們前面所用的孤兒程序。當父程序先退出時,系統會讓init程序接管子程序 。
2>子程序先於父程序終止,而父程序又沒有呼叫wait函式
此種情況子程序進入僵死狀態,並且會一直保持下去直到系統重啟。子程序處於僵死狀態時,核心只儲存程序的一些必要資訊以備父程序所需。此時子程序始終占有著資源,同時也減少了系統可以建立的最大程序數。
什麼是 僵死狀態呢?
乙個已經終止、但是其父程序尚未對其進行善後處理(獲取終止子程序的有關資訊,釋放它仍占有的資源)的程序被稱為僵死程序(zombie)。ps命令將僵死程序的狀態列印為z
3> 子程序先於父程序終止,而父程序呼叫了wait函式
此時父程序會等待子程序結束。
exit和exit的區別?
exit終止呼叫程序,但不關閉檔案,不清除輸出快取,也不呼叫出口函式。exit函式將終止呼叫程序。在退出程式之前,所有檔案關閉,緩衝輸出內容 將重新整理定義,並呼叫所有已重新整理的 出口函式 由atexit定義 作為系統呼叫而言,exit和exit是一對孿生兄弟,它們究竟相似到什麼程度,我們可以從l...
exit和exit的區別
在linux的標準庫函式中,有一套稱作高階i o的函式,我們熟知的printf fopen fread fwrite都在此列,他們也被稱作緩衝 i o。其特徵是對應每乙個開啟的檔案,都存在乙個緩衝區,在記憶體中都有一片緩衝區,每次讀檔案會多讀若干條記錄,這樣下次讀檔案時就可以直接從記憶體的快取中取出...
exit 和 exit 的區別
exit 和 exit 的效果都是讓程式退出執行,而 exit 用來 盡快 退出。先說一下atexit 函式。我們可以用atexit 註冊乙個或多個函式退出清理函式 或者on exit 但這個函式不建議用 這些清理函式按照註冊時的反順序,在exit 或main函式return時被呼叫。include...