errno的前世今生

當unix函數出錯時,常常返回一個負值,而且整形變量errno通常被設置爲含有附加信息的一個值。例如open函數如果成功,返回一個非負文件描述符。如果出錯,則返回-1。在open出錯時,有大約15種不同的errno值(文件不存在,權限問題等)。
某些函數並不返回負值而是使用另一種預定。例如,返回一個指向對象指針的大多數函數,在出錯時,將返回一個空指針。
在<errno.h>中定義了errno以及可以賦予它的各種常量,這些常量都以字符E開頭。在linux中,可以通過man 3 errno查看各種出錯常量。


對於errno應當知道兩條規則:
1、如果沒有出錯,則其值不會被一個例程清除。因此,僅當函數的返回值指明出錯時,才檢驗其值。
2、任何一個函數都不會將errno值設置爲0,在<errno.h>中定義的常量都不爲0。

C定義了兩個函數,幫助我們打印出錯信息。
char* strerror(int errnum);
此函數將errnum(通常是errno的值)映射成一個出錯字符串,並且返回此字符串的指針。

void perror(char* msg);
此函數首先輸出msg指向的字符串,然後是一個冒號,一個空格,接着是對應errno值的出錯信息,最後是一個換行符。


#include <errno.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
    fprintf(stderr, "EACCES: %s\n", strerror(EACCES));

    errno = ENOENT;
    perror(argv[0]);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章