#include <stdio.h>
void perror(const char *msg);
1. errno變量
檔案 <errno.h> 中定義了符号 errno 以及可以賦予它的各種常量,這些常量都是以字元 E 開頭。例如,若 errno 等于常量 EACCES,表示産生了權限問題(例如,沒有打開所要求檔案的足夠權限)。
errno特點:
1、當出錯的時候,errno會自動被指派。一個int資料
2、errno預設為0,表示沒有錯誤,當出錯時,errno被指派(大于0),然後保持改值,直到下一次出錯,被修改為下一次錯誤的值。
errno直接列印是一個數字,檢視不友善,可用函數轉換為字元串。
函數1
#include <string.h>
char *strerror(int errnum);
此函數将 errno映射為一個出錯資訊字元串,并且傳回此字元串的指針。
函數2
#include <stdio.h>
void perror(const char *msg);
它首先輸出由 msg 指向的字元串,然後是一個冒号,一個空格,接着是對應于 errno 值的出錯資訊,最後是一個換行符。
2. errno_demo
int main(int argc,char* argv[])
{
int fd;
if ((fd = open("foo.txt", O_RDONLY)) == -1)
{
printf("errno is %d \n", errno);
printf("error: %s \n", strerror(errno));
perror("open file:");
} else {
printf("open success \n");
}
return 0;
}
輸出結果:
errno is 2
error: No such file or directory
open file:: No such file or directory
源代碼位址: errno demo程式github
3. 多線程擴充
在支援線程的環境中,多個線程共享程序位址空間,每個線程都有屬于它自己的局部 errno 以避免一個線程幹擾另一個線程。
函數 strerror() 不是線程安全的。因為該函數将 errnum 對應的字元串儲存在一個靜态的緩沖區中,然後将該緩沖區的指針傳回。另一個線程調用 strerror() 就會重新設定靜态緩沖區的内容。