一、基本介紹
在Linux系統中,每一個錯誤都對應了一個唯一的錯誤碼,表示了相應錯誤的類型和錯誤產生的原因。Linux系統使用負數來表示錯誤碼,在頭文件errno.h中定義,通常使用全局變量errno來保存上一次系統調用的錯誤碼。使用perror或strerror函數可以將錯誤碼轉換為可讀性較強的字符串錯誤信息。
以下是一些常用的錯誤碼:
#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 */ #define ENXIO 6 /* No such device or address */ #define E2BIG 7 /* Argument list too long */ #define ENOEXEC 8 /* Exec format error */ #define EBADF 9 /* Bad file number */ #define ECHILD 10 /* No child processes */ #define EAGAIN 11 /* Try again */ #define ENOMEM 12 /* Out of memory */ #define EACCES 13 /* Permission denied */ ... // 其他錯誤碼省略
二、常見錯誤碼及其原因
1. EPERM
EPERM表示操作沒有被允許,通常是因為權限不足導致的。例如,試圖修改root用戶的密碼時,會返回EPERM錯誤。
#include #include #include int main() { if(setuid(0) == -1) { perror("setuid"); return errno; } printf("setuid success.\n"); return 0; }
以上代碼試圖切換當前進程的用戶身份為root,如果執行該程序的用戶沒有足夠的權限,setuid函數就會返回-1,並設置errno為EPERM。
2. ENOENT
ENOENT表示文件或目錄不存在。例如,試圖打開不存在的文件時,會返回該錯誤。
#include #include int main() { FILE* fp; fp = fopen("/path/to/nonexistent/file", "r"); if(fp == NULL) { perror("fopen"); return errno; } fclose(fp); return 0; }
以上代碼試圖打開一個不存在的文件,由於該文件不存在,fopen函數會返回NULL,並設置errno為ENOENT。
3. EIO
EIO表示輸入/輸出錯誤,通常是因為設備故障或文件系統損壞導致的。
#include #include int main() { FILE* fp; char buffer[1024]; size_t bytes_read; fp = fopen("/path/to/file", "r"); if(fp == NULL) { perror("fopen"); return errno; } bytes_read = fread(buffer, sizeof(char), sizeof(buffer), fp); if(bytes_read == 0) { if(ferror(fp)) { perror("fread"); return errno; } } fclose(fp); return 0; }
以上代碼試圖讀取一個文件,如果讀取過程中發生了輸入/輸出錯誤,fread函數會返回0,並設置errno為EIO。
三、常用處理方式
1. perror函數
perror函數用於將錯誤碼轉換為可讀性較強的錯誤信息輸出到標準錯誤流。例如,使用perror函數輸出上面示例程序的錯誤信息:
#include #include #include int main() { if(setuid(0) == -1) { perror("setuid"); return errno; } printf("setuid success.\n"); return 0; }
執行該程序時,如果當前用戶沒有充足的權限,perror函數將輸出:
setuid: Operation not permitted
2. strerror函數
strerror函數用於將錯誤碼轉換為可讀性較強的錯誤信息字符串。
#include #include #include int main() { if(setuid(0) == -1) { printf("setuid failed: %s\n", strerror(errno)); return errno; } printf("setuid success.\n"); return 0; }
執行該程序時,如果當前用戶沒有充足的權限,strerror函數將輸出:
setuid failed: Operation not permitted
四、總結
Linux系統的錯誤碼為我們處理程序中可能出現的錯誤提供了方便,通過errno.h頭文件中定義的錯誤碼,我們可以快速地確定程序中出現的錯誤類型和錯誤原因。在編寫程序時,我們應該仔細閱讀系統調用和庫函數對錯誤碼的文檔描述,了解每個錯誤碼的具體含義和解決方案,並使用perror和strerror等函數進行錯誤信息的輸出和處理。
原創文章,作者:ESBI,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/137838.html