函数简介篇——错误处理函数:errno值、perror()、streeor()、streeor_r()

说明
  本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
  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,因此线程是安全的。
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值