lienhua34 1. errno变量文件 <errno.h> 中定义了符号 errno 以及可以赋予它的各种常量,这些常量都是以字符 E 开头。例如,若 errno 等于常量 EACCES,表示产生了权限问题(例如,没有打开所要求文件的足够权限)。
对于 errno 应该知道两条规则。
因此,仅当函数的返回值指明出错时,才校验 errno 的值。
出错标志 errno 是一个整型数值,这个对于用户提示不够有好。C 标准定义了两个函数,用于帮助打印出错信息。
perror 函数基于 errno 的当前值,在标准出错上产生一条出错信息,然后返回。
它首先输出由 msg 指向的字符串,然后是一个冒号,一个空格,接着是对应于 errno 值的出错信息,最后是一个换行符。 例子: 下面代码展示了这两个出错函数的使用方法。 #include <string.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> int main(int argc, char *argv[]) { fprintf(stderr, "EACCES: %s\n", strerror(EACCES)); errno = ENOENT; perror(argv[0]); exit(0); } 编译该程序,生成errno_demo,然后执行它。 lienhua34:demo$ gcc -o errno_demo errno_demo.c lienhua34:demo$ ./errno_demo EACCES: Permission denied ./errno_demo: No such file or directory 2. 打印所有错误信息C 标准库定义了sys_nerr 用于记录错误信息总个数,下面程序通过循环来打印所有信息。 #include <string.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> int main(int argc, char *argv[]) { int idx = 0; for (idx = 0; idx < sys_nerr; idx++) { printf("Error #%3d: %s\n", idx, strerror(idx)); } exit(0); } 编译该程序,生成print_err,然后执行它。 lienhua34:demo$ gcc -o print_err print_err.c lienhua34:demo$ ./print_err Error # 0: Success Error # 1: Operation not permitted Error # 2: No such file or directory Error # 3: No such process Error # 4: Interrupted system call ... Error #133: Unknown error 133 Error #134: Unknown error 134 lienhua34:demo$ 3. 多线程扩展在支持线程的环境中,多个线程共享进程地址空间,每个线程都有属于它自己的局部 errno 以避免一个线程干扰另一个线程。 函数 strerror() 不是线程安全的。因为该函数将 errnum 对应的字符串保存在一个静态的缓冲区中,然后将该缓冲区的指针返回。另一个线程调用 strerror() 就会重新设置静态缓冲区的内容。 4. 出错恢复可将 <errno.h> 中定义的各种出错分成致命性的和非致命性的两类。对于致命性的错误,无法执行恢复动作,最多只能在用户屏幕上打印出一条出错信息,或者将一条出错信息写入日志文件,然后终止。而对于非致命性的错误,有时可以较妥善地进行处理。 |
|
来自: 戴维图书馆 > 《UNIX环境高级编程》