一、簡介
errno.h是一個C/C++標準庫頭文件,定義了整數變數errno,用來記錄錯誤信息(即錯誤碼)。errno是一個全局變數,通過它可以獲取發生錯誤的具體信息,這些信息可以被用來調試代碼。errno.h是unix/linux系統中常用的一種標準庫頭文件。
二、常用的errno定義
#include int main() { FILE *fp; errno = 0; fp=fopen("not_exist_file","r"); if(fp==NULL) { printf("errno=%d\n",errno); perror("open file "); } return 0; }
在上述示例代碼中,我們首先通過#include 引入errno頭文件,然後通過errno = 0對errno進行初始化。接著,我們從文件系統中打開一個不存在的文件,由於文件不存在,文件無法打開,因此fp的值為NULL,此時,我們通過printf列印出errno的值(在我們的示例中,errno的值為2)。然後,通過perror列印具體的錯誤信息。
errno的值和相關的錯誤信息可以在errno.h這個頭文件中找到。下面是一些常用的errno錯誤碼:
1、EPERM—1:
該錯誤通常是由於欲執行的操作不允許而導致的,例如試圖去寫一個 write-protected 的文件。另外一個例子是試圖修改一個只讀的文件系統。\
2、ENOENT—2:
試圖訪問的文件或目錄不存在。
3、EINTR—4:
該錯誤通常是由於一個慢速系統調用(譬如wait(),waitpid()等)被中斷而引起的。在應用程序和系統庫之間會自動重啟該系統調用。
三、errno與線程安全
errno是線程安全的,意味著每個線程都可以獨立地設置它自己的errno值而不會影響到其他線程。C11新增了errno_t類型,可以指向errno,這樣當在函數中發生錯誤時,可以把錯誤保存到另一個變數中,同時保留errno的值:
#include #include errno_t err; int main() { FILE *fp; err = fopen_s(&fp, "not_exist_file", "r"); if (err != 0) { printf("fopen_s failed with error: %d\n", err); if(errno!=0) { perror("The error"); } return 1; } printf("File is opened\n"); return 0; }
四、errno的正確使用方法
正確使用errno的一個重要的方面是要避免將其視為簡單的錯誤代碼。errno的值在不同的函數之間可能會互相覆蓋,因此在使用之前應該首先保存起來,以幫助確定錯誤發生的原因。
以下是一個使用errno的示例:
#include #include int main() { FILE *fp; int errnum; fp = fopen("not_exist_file", "r"); if (fp == NULL) { errnum = errno; fprintf(stderr, "錯誤號 %d\n", errno); perror("通過perror輸出錯誤"); fprintf(stderr, "打開文件錯誤 :%s\n", strerror(errnum)); } else { fclose(fp); } return 0; }
五、結論
errno.h是一個非常有用的工具,它可以幫助我們快速定位代碼中出現的錯誤,並且讓我們更輕鬆地調試代碼。errno變數是線程安全的,但應避免將其視為簡單的錯誤代碼。正確地使用errno需要首先保存其值,以幫助確定發生錯誤的原因。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/239789.html