![Linux程序设计(第4版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/825/26211825/b_26211825.jpg)
上QQ阅读APP看书,第一时间看更新
3.9 错误处理
正如你已经看到的,本章介绍的许多系统调用和函数都会因为各种各样的原因而失败。它们会在失败时设置外部变量errno的值来指明失败的原因。许多不同的函数库都把这个变量用做报告错误的标准方法。值得重申的是,程序必须在函数报告出错之后立刻检查errno变量,因为它可能被下一个函数调用所覆盖,即使下一个函数自身并没有出错,也可能会覆盖这个变量。
错误代码的取值和含义都列在头文件errno.h里,如下所示。
❑ EPERM:操作不允许。
❑ ENOENT:文件或目录不存在。
❑ EINTR:系统调用被中断。
❑ EIO:I/O错误。
❑ EBUSY:设备或资源忙。
❑ EEXIST:文件存在。
❑ EINVAL:无效参数。
❑ EMFILE:打开的文件过多。
❑ ENODEV:设备不存在。
❑ EISDIR:是一个目录。
❑ ENOTDIR:不是一个目录。
有两个非常有用的函数可以用来报告出现的错误,它们是strerror和perror。
3.9.1 strerror函数
strerror函数把错误代码映射为一个字符串,该字符串对发生的错误类型进行说明。这在记录错误条件时十分有用。
该函数原型如下:
![](https://epubservercos.yuewen.com/08DD0E/14642180305205206/epubprivate/OEBPS/Images/figure_0125_0001.jpg?sign=1738864940-oCyt0BnA9qiCGokSyw2WmEqHomkmH2kY-0-cd4828e4855c0e56d6361438ede17ad6)
3.9.2 perror函数
perror函数也把errno变量中报告的当前错误映射到一个字符串,并把它输出到标准错误输出流。该字符串的前面先加上字符串s(如果不为空)中给出的信息,再加上一个冒号和一个空格。
该函数原型如下:
![](https://epubservercos.yuewen.com/08DD0E/14642180305205206/epubprivate/OEBPS/Images/figure_0125_0002.jpg?sign=1738864940-Xhs7stLdlypQpw3A3pALKSkBjGHpshHk-0-4d1a8e17899436196004bbddd4353cef)
请看下面的例子:
![](https://epubservercos.yuewen.com/08DD0E/14642180305205206/epubprivate/OEBPS/Images/figure_0125_0003.jpg?sign=1738864940-mzSk6AyqRh0X2Um8ybo93iM6dAQwoIjI-0-f965972e17640db806bfda8f2b485777)
它可能在标准错误输出中给出如下的输出结果:
![](https://epubservercos.yuewen.com/08DD0E/14642180305205206/epubprivate/OEBPS/Images/figure_0126_0001.jpg?sign=1738864940-2eqyjl07e5O0GnrGDwarWrO1sfmoJoVb-0-db15a457571e2276e1b64f0ec97e3134)