errno是什么?
為防止和正常的返回值混淆,系統(tǒng)調(diào)用并不直接返回錯(cuò)誤碼,而是將錯(cuò)誤碼放入一個(gè)名為errno的全局變量中。如果一個(gè)系統(tǒng)調(diào)用失敗,你可以讀出errno的值來(lái)確定問題所在。
errno不同數(shù)值所代表的錯(cuò)誤消息定義在errno.h中,你也可以通過(guò)命令"man 3 errno"來(lái)察看它們。
需要注意的是,errno的值只在函數(shù)發(fā)生錯(cuò)誤時(shí)設(shè)置,如果函數(shù)不發(fā)生錯(cuò)誤,errno的值就無(wú)定義,并不會(huì)被置為0。另外,在處理errno前最好先把它的值存入另一個(gè)變量,因?yàn)樵阱e(cuò)誤處理過(guò)程中,即使像printf()這樣的函數(shù)出錯(cuò)時(shí)也會(huì)改變errno的值。
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(void)
{
int fd;
//extern int errno;這句應(yīng)該是畫蛇添足
if((fd = open("no/such/file",0)) < 0)
{
printf("errno=%d\n",errno);
char * mesg = strerror(errno);
printf("Mesg:%s\n",mesg);
}
exit(0);
}
strerror
#include <string.h>
char*strerror(int errnum);
#include <stdio.h>
void perror(const cahr *msg);
strerror是把一個(gè)錯(cuò)誤numb作為參數(shù),然后返回錯(cuò)誤numb所對(duì)應(yīng)的錯(cuò)誤語(yǔ)段,一般用errno。
perror是在標(biāo)準(zhǔn)輸出上輸出msg字符串,然后再后面加上:錯(cuò)誤語(yǔ)段(這個(gè)錯(cuò)誤語(yǔ)段對(duì)應(yīng)這時(shí)的errno)。
測(cè)試代碼如下:
#include <stdio.h>
2 #include <string.h>
3 #include <errno.h>
4
5 int
6 main(int argc, char *argv[])
7 {
8 fprintf(stderr, "EACCES:%s\n", strerror(EACCES));
9 errno = ENOENT;
10 printf("ENOENT:%s\n",strerror(errno));
11 perror(argv[0]);
12 exit(0);
13 }