C語言學習之輸入 輸出函式第二講

2021-07-09 11:04:02 字數 3128 閱讀 9856

1.終止執行函式

函式原型:void exit ( int  starus);

函式說明:exit用於終止乙個程式的執行。原型定義於stdlib.h,status引數返回給作業系統,用於提示程式是否正常完成。函式本身沒有返回值,因為程式已經消失。可以預定義exit_success和exit_failure分別提示程式的終止成功還是失敗。

exit(0):正常執行程式並退出程式;

exit(1):非正常執行導致退出程式;

2.exit與其類似函式的區別

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函式 

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

參考部落格exit()和_exit()函式

C語言學習(二)資料輸入輸出

字元輸入函式 getchar 字元輸出函式 putchar 格式輸入函式 scanf 格式輸出函式 printf 字串輸入函式 gets 字數串輸出函式 puts 字元輸出函式putchar c includevoid main 字元輸入函式getchar includevoid main d 以帶...

C語言學習 1 3輸入輸出

常使用的鍵盤輸入函式scanf,輸出函式printf,字元輸入函式getchar,字元輸出函式putchar 函式定義 int putchar int ch ch型別可以是int也可以char 例 putchar a 字元輸出 putchar 101 轉移字元輸出 從終端 輸入裝置 輸入乙個字元 函...

C語言學習 輸入輸出與變數

輸入scanf 特殊字元變數 輸出輸入都必須使用佔位符 a,a 讀入乙個浮點值 僅c99有效 c 讀入乙個字元 d 讀入十進位制整數 i 讀入十進位制,八進位制,十六進製制整數 o 讀入八進位制整數 x,x 讀入十六進製制整數 s 讀入乙個字串,遇空格 製表符或換行符結束。f,f,e,e,g,g 用...