Linux程序學習四

2021-05-27 07:22:58 字數 2800 閱讀 5147

exit()和_exit()函式

程序就好比人一樣有其生命,我們通過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函式

此時父程序會等待子程序結束。

linux的學習(四)程序管理

程序和程式的區別 1 程式是靜態概念,本身作為一種軟體資源長期儲存 而程序是程式的執行過程,它是動態概念,有一定的生命期,是動態產生和消亡的。2 程式和程序無一一對應關係。乙個程序在活動中可有順序地執行若干個程式。程序和執行緒的區別 程序管理的作用?判斷伺服器的健康狀態 檢視系統所有的程序 殺死程序...

Linux學習 程序

1.程序定義 程序就是cpu未完成的工作 2.ps檢視命令 ps a 關於當前環境的所有程序 ps x a 所有程序 ps f 顯示程序從屬關係 ps e 顯示程序呼叫環境工具的詳細資訊 ps l 長列表顯示程序的詳細資訊 ps u 顯示程序的使用者資訊 ps a 顯示shell前台執行命令的程序,...

Linux學習 程序

1.程序定義 程序就是cpu未完成的工作 2.ps命令 psa 關於當前環境的所有程序 x a 所有程序 f 顯示程序從屬關係 e 顯示程序呼叫環境工具的詳細資訊 l 長列表顯示程序的詳細資訊 u 顯示程序的使用者資訊 a 顯示shell前台執行命令的程序,但不保函shell本身 ps ax o c...