1.操作系统的定义
② 宽泛来说,是指内核和一些软件应用等
2.出错处理相关 errno 变量及:strerror和perror
在文件<errno.h>文件中定义了errno 以及可以赋予它的各个常量。这些常量都以E开头。该变量在头文件中的定义
#ifndef errno
extern int errno;
#endif
因为,errno可以把最后一次调用C的错误代码保留,如果最后一次调用C函数成功,则不会更改errno,所以如果你要使用之前,可以先清空errno,然后通过errno判断下面要执行的函数是否成功。另外,任何函数都不会将errno的值设置为0,而且<errno.h>中的所有常量都不为0.
把errno转换为相应文字:
1> 使用strerror函数
函数原型:char * strerror(int errno)
使用方法:fprintf(stderr, "%s", strerror(errno));
2> 使用perror函数
函数原型:void perror(const char *s)
使用说明:参数s指定的字符串是要先打印出来的信息,可以由我们自己定义,然后系统会在s字符串后加上错误原因的字符串。
下面是一个例程:
#include "apue.h"
#include <errno.h>
int
main(int argc, char *argv[])
{
fprintf(stderr, "EACCES: %s\n", strerror(EACCES));
errno = ENOENT;
perror(argv[0]);
exit(0);
} //编译成 a.out 文件,运行方式:./a.out
输出:
EACCES: Permission denied
./a.out: No such file or directory
注:errno是全局变量,如果在多线程或者进程编程中,子线程想要查看errno确定自己的错误类型,可惜该errno被另一个线程更改了,这就出问题了。errno的线程/进程安全性指的就是这点,在多线程和多进程编程中,errno会变为线程或进程的私有变量。
POSIX和ISO C将errno定义为一个符号,它可以是一个包含出错编号的整数,也可以是一个返回出错编号指针的函数。
extern int *__errno_location(void);
#if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value. */
#define errno (*__errno_location ())
#endif