一、簡介
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-hant/n/239789.html
微信掃一掃
支付寶掃一掃