|
C語言中的return,exit,break,continue。前兩個函數(shù)使用的同時通常都會帶上程序退出時的狀態(tài)碼,標準C中有EXIT_SUCCESS和EXIT_FAILURE兩個宏,位于/usr/include/stdlib.h中。
是這樣定義的的:
#define EXIT_FAILURE 1
#define EXIT_SUCCESS 0
一.exit函數(shù)的作用及其與_exit()函數(shù)的區(qū)別。
有庫文件中的定義可知:exit是一個庫函數(shù),exit(1)表示發(fā)生錯誤后退出程序,exit(0)表示正常退出。
在stdlib.h中exit函數(shù)是這樣子定義的:void exit(int status);
這個系統(tǒng)調(diào)用是用來終止一個進程的,無論在程序中的什么位置,只要執(zhí)行exit,進程就會從終止進程的運行。
講到exit這個系統(tǒng)調(diào)用,就要提及另外一個系統(tǒng)調(diào)用,_exit,_exit()函數(shù)位于unistd.h中,相比于exit(),_exit()函數(shù)的功能最為簡單,直接終止進程的運行,釋放其所使用的內(nèi)存空間,并銷毀在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),而exit()在于在進程退出之前要檢查文件的狀態(tài),將文件緩沖區(qū)中的內(nèi)容寫回文件。
下面我們通過于printf這個操作緩沖區(qū)的函數(shù)結(jié)合來說明上面的情況:1.exit終止進程。
#include
#include
main()
{
printf("output begin/n");
exit(0);
printf("output end/n");
}
執(zhí)行g(shù)cc -o exit1 exit1.c生成exit1,執(zhí)行,只會打印出output begin.
2. exit將緩沖區(qū)內(nèi)容寫回文件。
對應每一個打開的文件,在內(nèi)存中都有一片緩沖區(qū),每次讀文件時,會多讀出若干條記錄,這樣下次讀文件時就可以直接從內(nèi)存的緩沖區(qū)中讀 取,每次寫文件的時候,也僅僅是寫入內(nèi)存中的緩沖區(qū),等滿足了一定的條件(達到一定數(shù)量,遇到特定字符(如換行符/n和文件結(jié)束符EOF)),再將緩沖區(qū) 中的內(nèi)容一次性寫入文件,我們知道
void exit(int status);
exit()用來正常終結(jié)目前進程的執(zhí)行,并把參數(shù)status返回給父進程,而進程所有的緩沖區(qū)數(shù)據(jù)會自動寫回并關(guān)閉未關(guān)閉的文件。
#include
#include
main()
{
printf("output begin/n");
printf("content in buffer");
exit(0);
}
$ ./exit1
output begin
content in buffer
printf()會根據(jù)參數(shù)format字符串來轉(zhuǎn)換并格式化數(shù)據(jù),然后將結(jié)果寫出到標準輸出設(shè)備,直到出現(xiàn)字符串結(jié)束('/0')為止。可見,exit將未出現(xiàn)換行符的語句保存到標注輸出文件。
3._exit()不會執(zhí)行清理I/O緩沖的操作。
_exit()用來立刻結(jié)束目前進程的執(zhí)行,并把參數(shù)status返回給父進程,并關(guān)閉未關(guān)閉的文件。此函數(shù)調(diào)用后不會返回,并且會傳遞SIGCHLD信號給父進程,父進程可以由wait函數(shù)取得子進程結(jié)束狀態(tài)。
#include
#include
main()
{
printf("output begin/n");
printf("content in buffer/n");
_exit(0);
}
$ ./exit2
output begin
實際上因為第二條printf語句沒有滿 足特定的條件,它們還只是保存在緩沖區(qū)內(nèi),這時我們用_exit()函數(shù)直接將進程關(guān)閉,緩沖區(qū)中的數(shù)據(jù)就會丟失,
和exit比較,return主要用于提供函數(shù)返回值,continue,break語句則大多數(shù)情況下用于循環(huán)中。許多朋友可能會將這三條語句與exit搞混,并且對這三個語句區(qū)分不清楚。
二.exit和return的區(qū)別與聯(lián)系。
當然,在進程操作中,我們需要來區(qū)分一下exit和return。
1.exit()結(jié)束當前進程/當前程序/,在整個程序中,只要調(diào)用exit就結(jié)束(當前進程或者在main時候為整個程序)
2.return()是當前函數(shù)返回,當然如果是在主函數(shù)main, 自然也就結(jié)束當前進程了,如果不是,那就是退回上一層調(diào)用。在多個進程時.如果有時要檢測上進程是否正常退出的.就要用到上個進程的返回值,依次類推。
進程環(huán)境與進程控制(1): 進程的開始與終止
exit可以返回小于256的任何整數(shù)。返回的不同數(shù)值主要是給調(diào)用者作不同處理的。
單獨的進程是返回給操作系統(tǒng)的。如果是多進程,是返回給父進程的。父進程里面調(diào)用waitpid()等函數(shù)得到子進程退出的狀態(tài),以便作不同處理。根據(jù)相應的返回值來讓調(diào)用者作出相應的處理.總的說來,exit()就是當前進程把控制權(quán)返回給調(diào)用該程序的程序,括號里的是返回值,告訴調(diào)用程序該程序的運行狀態(tài)。
進程終止:
C程序的終止分為兩種: 正常終止和異常終止.
正常終止分為: return, exit, _exit, _Exit, pthreade_exit
異常中指分為: abort, SIGNAL, 線程響應取消
主要說一下正常終止的前4種, 即exit系列函數(shù)。
return函數(shù)exit函數(shù)區(qū)別:
1,exit用于在程序運行的過程中隨時結(jié)束程序,exit的參數(shù)是返回給OS的。main函數(shù)結(jié)束時也會隱式地調(diào)用 exit函數(shù)。exit函數(shù)運行時首先會執(zhí)行由atexit()函數(shù)登記的函數(shù),然后會做一些自身的清理工作,同時刷新所有輸出流、關(guān)閉所有打開的流并且關(guān)閉通過標準I/O函數(shù)tmpfile()創(chuàng)建的臨時文件。exit是結(jié)束一個進程,它將刪除進程使用的內(nèi)存空間,同時把錯誤信息返回父進程,而 return是返回函數(shù)值并退出函數(shù)
2,return是語言級別的,它表示了調(diào)用堆棧的返回;而exit是系統(tǒng)調(diào)用級別的,它表示了一個進程的結(jié)束。
3.在有返回值的函數(shù)中,return語句的作用是提供整個函數(shù)的返回值,并結(jié)束當前函數(shù)返回到調(diào)用它的地方。在沒有返回值的函數(shù)中也可以使用return語句,例如當檢查到一個錯誤時提前結(jié)束當前函數(shù)的執(zhí)行并返回。一般程序執(zhí)行到 main() 的結(jié)束就完成了, 如果想在程序結(jié)束時做一些事情, 可以嘗試著用這個函數(shù).
example:
void test1(void)
{
printf("exit test1/n");
}
void test2(void)
{
printf("exit test2/n");
}
int main()
{
atexit(test1);
atexit(test2);
printf("exit main/n");
return 0;
}
三.break和continue的區(qū)別與聯(lián)系。
break 語句通常用在循環(huán)語句和開關(guān)語句中。當 break 用于開關(guān)語句 switch 中時,可使
程序跳出 switch 而執(zhí)行 switch 以后的語句;如果沒有 break 語句,則將成為一個死循環(huán)而
無法退出。
當 break 語句用于 do-while、for、while 循環(huán)語句中時,可使程序終止循環(huán)而執(zhí)行循環(huán)
后面的語句, 通常 break 語句總是與 if 語句聯(lián)在一起。即滿足條件時便跳出循環(huán)。
#include
main()
{
int i=0;
char c;
while(1)
{
c='/0';
while(c!=13&&c!=27)
{
c=getchar();
printf("%c/n",c);
}
if(c=27)
break;
i++;
printf("the no is %d/n",i);
}
printf("End/n");
}
c='/0'是給變量C附初值,當鍵盤接收到回車或者ESC按鍵,開始接受字符,并且打印到終端,如果鍵盤接收到ESC按鍵,則直接退出while循環(huán)。
注意:
1) break 語句對 if-else 的條件語句不起作用。
2) 在多層循環(huán)中, 一個 break 語句只向外跳一層。
continue 語句的作用是跳過循環(huán)本中剩余的語句而強行執(zhí)行下一次循環(huán)。continue 語
句只用在 for、while、do-while 等循環(huán)體中,常與 if 條件語句一起使用,用來加速循環(huán)。
main()
{
char c;
while(c!=13)
{
c=getch();
if(c==0X1B)
continue;
printf("%c/n", c);
}
}
continue和break都可以用于C提供的全部三種循環(huán)結(jié)構(gòu)。continue會使循環(huán)跳出循環(huán)體內(nèi)剩余的語句,轉(zhuǎn)而判斷循環(huán)條件是否成立,然后選擇是否再次進入循環(huán)體。break作用是跳出循環(huán),如果break位于循環(huán)嵌套中的一個內(nèi)循環(huán)則僅跳出這個內(nèi)循環(huán)。
|
|