一: errno变量
Linux系统函数出错时通常会返回一个负值,并把整形变量errno设置为具有特定信息的值。
errno被POSIX和ISO C定义为一个符号,它拓展成为一个可修改的整型左值。它可以是一个包含出错编号的整数,也可以是一个返回出错编号指针的函数。
以前errno被定义成extern int errno,但这样会存在一个问题:在多线程环境中errno会被多个线程共享,当线程A调用系统函数出错时errno值会被改变,这时操作系统调度让线程B执行,线程B调用系统函数也出错,errno值再次被改变,当线程A再次被调度时去检测errno值,得到的却是错误的信息!
现在这种情况已被改善:每个线程都有属于自己的局部errno,这样当前线程使用的errno不必担心被其他线程修改。
errno被定义在头文件<errno.h>中。
对于errno有两点需要注意:
1. 如果系统函数被调用后没有出错,其值不会被例程清除。因此,仅当函数的返回值指明出错时,我们才去检验其值。
2. 任何函数都不会把errno设置为0,而且在<errno.h>中定义的所有常量都不为0。
综合上述两点,当使用一个无法从返回值上判断正误的的函数前最好先把errno清0,函数如果没有正确执行,则可通过errno判断哪里出现了问题。
二: 错误处理函数
C标准定义了两个错误处理函数,用于打印错误信息:
1. strerror