當 Linux C API 函式發生錯誤時,會將全域變數 errno(需 #include <errno.h>)設為特定整數值,不同值代表不同錯誤原因。透過檢查 errno 可快速定位問題。
| 函式 | 用途 | 範例 |
|---|---|---|
perror(const char *s) | 將上一個函式的錯誤原因輸出到 stderr,前綴字串 s | perror("open failed"); |
strerror(int errno) | 將錯誤代碼轉為描述字串,可組合輸出 | fprintf(stderr, "Error: %s", strerror(errno)); |
printf("%m") | 格式化字串直接輸出 errno 對應錯誤訊息 | printf("Error: %m\n", errno); |
網路相關函式(如 gethostbyname())錯誤代碼存放在 h_errno 而非 errno,需使用 herror() 輸出。
| 代碼 | 宏定義 | 含義 |
|---|---|---|
| 1 | EPERM | 操作不被允許 |
| 2 | ENOENT | 檔案或目錄不存在 |
| 13 | EACCES | 權限被拒絕 |
| 11 | EAGAIN | 資源暫時不可用,請重試 |
| 12 | ENOMEM | 記憶體不足 |
| 28 | ENOSPC | 裝置剩餘空間不足 |
| 32 | EPIPE | 管道破裂 |
| 111 | ECONNREFUSED | 連線被拒絕 |
errno 13 即可顯示代碼 13 對應資訊(需安裝 errno 套件)。/usr/include/asm-generic/errno-base.h 及 errno.h 完整定義。strerror() 將錯誤碼轉為人類可讀訊息記錄日誌。