天天看點

c語言——出錯處理errno 3. 多線程擴充

#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() 就會重新設定靜态緩沖區的内容。

繼續閱讀