说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
内容来源:
《Linux系统编程》
一、错误处理:errno值
1.glibc的支持:
glibc对库函数和系统调用的errno提供透明支持。
2.errno值定位错误:
在系统编程中,错误通常通过函数的返回值表示,错误值描述调用函数发生了错误,但不提供原因,可通过特殊的变量errno
来定位错误原因。
3.errno的时效性:
errno值仅在设置函数错误后短时间有效,因为后续成功执行的函数可能修改errno值。
4.errno的位置与定义:
位于:#include <errno.h>
定义:
/* 用于各种库函数设置的错误代码 */
extern int *__errno_location (void) __THROW __attribute_const__;
# define errno (*__errno_location ())
5.列举标准定义与错误相匹配的文字描述如下:
序列号(非对应编码) | 预处理器定义 | 说明 |
---|---|---|
1. | E2BIG | 参数列表太长 |
2. | EACCESS | 权限不足 |
3. | EAGAIN | 重试 |
4. | EBADF | 文件号错误 |
5. | EBUSY | 设备或资源忙 |
6. | ECHILD | 无子进程 |
7. | EDOM | 数学参数不在函数域内 |
8. | EEXIST | 文件已存在 |
9. | EFAULT | 地址错误 |
10. | EFBIG | 文件太大 |
11. | EINTR | 系统调用被中断 |
12. | EINVAL | 参数无效 |
13. | EIO | I/O错误 |
14. | EISDIR | 是目录 |
15. | EMFILE | 打开文件太多 |
16. | EMLINK | 太多链接 |
17. | ENFILE | 文件表溢出 |
18. | ENOENT | 无此文件或目录 |
19. | ENOEXEC | 执行格式错误 |
20. | ENOMEM | 内存用尽 |
21. | ENOSPC | 设备无剩余空间 |
22. | ENOTDIR | 非目录 |
23. | ENOTTY | 不合理I/O控制操作 |
24. | EMXIO | 无此设备或地址 |
25. | EPERM | 操作不允许 |
26. | EPIPE | 管道损坏 |
27. | ERANGE | 结果范围太大 |
28. | EROFS | 只读文件系统 |
29. | ESPIPE | 非法定位 |
30. | ESRCH | 无此进程 |
31. | ETXIBSY | 文本文件忙 |
32. | EXDEV | 跨文件系统 |
二、将errno值转换到对应文本
(1)perror()函数
1.perror的位置与定义
位于:#include <stdio.h>
定义:
/* 打印一条描述errno值含义的消息。 */
extern void perror (const char *__s);
2.perror的示例(perror.c):
#include<stdio.h>
int main(int argc,char *argv[])
{
FILE *file;
file = fopen("/home/hhb/桌面/test.txt","r");
if(file == NULL)
{
printf("open the failure!\n");
perror("open");
}
else
{
printf("open the success!");
fclose(file);
}
return 0;
}
①编译:gcc perror.c -o perror
②运行:./perror
③结果:
open the failure!
open: No such file or directory
3.perror的函数作用:(结合上面结果更容易理解)
该函数想stderr(标准错误输出)打印出__s指针指向的字符串前缀,后加冒号(:
),然后用errno描述当前错误所陈述的字符串。
(2)streeor()函数
1.streeor的位置与定义
位于:#include <string.h>
定义:
extern char *strerror (int __errnum) __THROW;
2.streeor的函数功能:
返回一个字符串,描述ERRNUM中’ errno’代码的含义。
字符串不能被应用程序修改,但可被接下来的perror()
和strerror ()
函数修改,该方法并不是线程安全。
(3)streeor_r()函数
1.streeor_r的位置与定义:
位于:#include <string.h>
定义:
# ifdef __REDIRECT_NTH
extern int __REDIRECT_NTH (strerror_r,
(int __errnum, char *__buf, size_t __buflen),
__xpg_strerror_r) __nonnull ((2))
__attr_access ((__write_only__, 2, 3));
# else
extern int __xpg_strerror_r (int __errnum, char *__buf, size_t __buflen)
__THROW __nonnull ((2)) __attr_access ((__write_only__, 2, 3));
# define strerror_r __xpg_strerror_r
# endif
2.streeor_r的函数功能:
用描述ERRNUM中’ errno’代码含义的字符串填充BUF.
线程安全,它向buf指向的长度为len的缓冲区写入数据。
成功时返回0,失败时返回-1.(错误时同样设置errno值)
三、注意
这边指的线程安全是由于在单线程程序中,error为全局变量。
对于多线程程序中,每个程序都保留自己errno,因此线程是安全的。