在調用庫函數或系統調用函數後,絕大多數情況下執行成功返回 0;如果執行失敗則返
回-1,並對外部全域變數 error 賦值,以指示具體的錯誤情況。所有的錯誤碼都在 errno.h
檔案中定義。以下是/usr/include/asm/errno.h 檔案的部分內容。
come from /usr/include/asm/errno.h
#ifndef _I386_ERRNO_H
#define _I386_ERRNO_H
#define EPERM 1/* Operation not permitted */ //沒有操作許可權
#define ENOENT 2/* No such file or directory */ //檔案和目錄不存在
#define ESRCH 3/* No such process */ //沒有此程式
#define EINTR 4/* Interrupted system call */ //系統調用中斷
#define EIO 5/* I/O error */ //I/O 錯誤
……
為了列印出具體的 error 值所對應的錯誤提示資訊,一般使用 perror 函數。此函式宣告
//come from /usr/include/stdio.h
738 __BEGIN_NAMESPACE_STD
739 /* Print a message describing the meaning of the value of errno. // 列印錯誤值的
具體資訊描述
740
741 This function is a possible cancellation point and therefore not
742 marked with __THROW. */
743 extern void perror (__const char *__s); //perror 函式宣告
744 __END_NAMESPACE_STD
另外,Linux 系統還提供了以下錯誤處理函數:
#include //string.h 標頭檔中
char *strerror(int errnum); //strerror 函式宣告
#include //errno.h 標頭檔中
extern char *sys_errlist[ ]; //sys_errlist 函式宣告
extern int sys_nerr; //sys_nerr 函式宣告
perror()可將語言相關的訊息寫入到標準錯誤輸出,描述調用系統函數或庫函數期間遇到
的最後一個錯誤。perror()首先輸出參數字串 s,後接冒號、空格、訊息和分行符號。為了發
揮它的最大作用,參數字串應包括導致錯誤的程式的名稱。錯誤編號取自符號 errno,出錯
時將設定此符號,但執行無錯誤調用後不會清除此符號。訊息的內容與將 errno 用作參數的
strerror()函數返回的內容相同。如果給定了一個 NULL 字串,則 perror()函數只輸出訊息和
分行符號。
perror()函數沒有傳回值。如果 errnum(sterror 函數的形參)訊息編號有效,則 strerror()
將返回指向語言相關的訊息字串的指標。程式不應修改所指向的數組,而後續調用該函數
可覆蓋該數組。如果有效 errnum 訊息編號不包括對應語言相關的訊息,則 strerror()會將
errnum 用作要加入 sys_errlist 的索引,以擷取訊息字串。如果 errnum 訊息編號無效,則
strerror()將返回指向 NULL 字串的指標。
為使各種形式的訊息格式化,系統提供了 strerror() 函數和訊息字串數組 sys_errlist。strerror()
函數可將 errnum 中的錯誤編號映射為語言相關的錯誤訊息字串,同時返回指向該字串的
指標。返回的訊息字串不帶分行符號。可將 errno 用作要加入 sys_errlist 的索引,以擷取不帶
分行符號的未轉換訊息字串。
另外,外部語言環境影響會對 perror 函數產生影響,環境變數 LANG 環境變數指定
strerror()和 perror()輸出的訊息的語言類型。如 果 語言相關的訊息不可用,或者未設定 LANG,
或者將其設定為空白字串,則將使用與“C”語言關聯的訊息的預設版本。
本文由 知識無憂網 首發,轉載請保留此資訊!