出错处理函数abort、exit、atexit、strerror
生活随笔
收集整理的這篇文章主要介紹了
出错处理函数abort、exit、atexit、strerror
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
出錯處理函數abort、exit、atexit、strerror. . .2010-06-30 22:43摘要:本文詳細講述了幾個出錯處理的函數abort、exit、atexit、strerror函數的使用方法,并給出來具體的示例程序。 函數名: abort 功 能: 異常終止一個進程 用 法: void abort(void); 頭文件:#include 說明:abort函數是一個比較嚴重的函數,當調用它時,會導致程序異常終止, 而不會進行一些常規的清除工作,比如釋放內存等。 程序例: #include #include int main(void) { puts( "About to abort..../n" ); abort(); puts( "This will never be executed!/n" ); exit( EXIT_SUCCESS ); } [root@localhost error_process]# gcc abort.c [root@localhost error_process]# ./a.out About to abort.... 已放棄 ----------------------------------- 頭文件 #include定義函數 void exit(int status); exit()用來正常終結目前進程的執行,并把參數 status 返回給父進程, 而進程所有的緩沖區數據會自動寫回并關閉未關閉的文件。 它并不像abort那樣不做任何清理工作就退出,而是在完成所有的清理工作后才退出程序。 ---------------------------------------- atexit(設置程序正常結束前調用的函數) 頭文件 #include定義函數 int atexit (void (*function)(void)); 返回值 如果執行成功則返回 0,否則返回-1,失敗原因存于 errno 中。 atexit()用來設置一個程序正常結束前調用的函數。當程序通過調用 exit()或從 main 中返回時,參數 function 所指定的函數會先被 調用,然后才真正由 exit()結束程序。 很多時候我們需要在程序退出的時候做一些諸如釋放資源的操作,但程序退出的方式有很多種,比如main()函數運行結束、在程序的某個地方用exit() 結束程序、用戶通過Ctrl+C或Ctrl+break操作來終止程序等等,因此需要有一種與程序退出方式無關的方法來進行程序退出時的必要處理。方法就 是用atexit()函數來注冊程序正常終止時要被調用的函數。 atexit()函數的參數是一個函數指針,函數指針指向一個沒有參數也沒有返回值的函數。atexit()的函數原型是:int atexit (void (*)(void)); 在一個程序中最多可以用atexit()注冊32個處理函數,這些處理函數的調用順序與其注冊的順序相反,也即最先注冊的最后調用,最后注冊的最先調用。 #include #include void my_exit(void) { printf( "Before exit..../n" ); } int main(void) { atexit( my_exit ); return 0; } [root@localhost error_process]# gcc atexit.c [root@localhost error_process]# ./a.out Before exit.... ----------------------------------------------------- strerror(返回錯誤原因的描述字符串) 頭文件 #include定義函數 char * strerror(int errnum); strerror() 用來依參數 errnum 的錯誤代碼來查詢其錯誤原因的描述字符串,然后將該字符串指針返回。 這時如果把 errno 傳個strerror,就可以得到可讀的提示信息,而不再是一個冷冰冰的數字了。 返回值 返回描述錯誤原因的字符串指針。 #include #include int main(void) { int i; for ( i=0; i<10; i++ ) { printf( "%d:%s/n", i, strerror(i) ); } return 0; } [root@localhost error_process]# gcc strerror.c [root@localhost error_process]# ./a.out 0:Success 1:Operation not permitted 2:No such file or directory 3:No such process 4:Interrupted system call 5:Input/output error 6:No such device or address 7:Argument list too long 8:Exec format error 9:Bad file descriptor [root@localhost error_process]# http://hi.baidu.com/flyownway/blog/item/0cfb6703842d85ea08fa93b0.html ------------------------------------------------ 3.9 錯誤處理 正如我們已經看到的,本章介紹的許多系統調用和函數 都會因為各種各樣的原因而失敗。失敗時,它們會設置外部變量errno的值來指明失敗的原因。許多不同的函數庫都把這個變量用做報告錯誤的標準方法。我們 也反復告誡大家,程序必須在函數報告出錯之后立刻檢查errno變量,因為它可能被下一個函數調用所覆蓋,即使下一個函數自身并沒有出錯,也可能會覆蓋這 個變量。 錯誤代碼的取值和含義都列在頭文件errno.h里,其中包括: l EPERM:操作不允許。 l ENOENT:文件或目錄不存在。 l EINTR:系統調用被中斷。 l EIO:I/O錯誤。 l EBUSY:設備或資源忙。 l EEX IST:文件存在。 l EINVA L:無效參數。 l EMFILE:打開的文件過多。 l ENODEV:設備不存在。 l EISDIR:是一個目錄。 l ENOTDIR:不是一個目錄。 有兩個非常有用的函數可以用來報告出現的錯誤,它們是strerror和perror。 3.9.1 strerror函數 strerror函數把錯誤編碼映射為一個字符串,該字符串對發生的錯誤類型進行說明。這在記錄錯誤條件時十分有用。 函數原型如下: 3.9.2 perror函數 perror函數也把error變量中報告的當前錯誤映射到一個字符串,并把它輸出到標準錯誤輸出流。該字符串的前面先加上參數s(如果s不為空)給出的信息,再加上一個冒號和一個空格。 函數原型如下: 請看下面的例子: 它會在標準錯誤輸出中給出如下的輸出結果: http://hi.baidu.com/steven0821/blog/item/8c695112e67197f1c2ce7931.html
總結
以上是生活随笔為你收集整理的出错处理函数abort、exit、atexit、strerror的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杂谈计算机图书翻译
- 下一篇: exit函数的头文件问题