APUE 学习记录 20200619

赤发鬼
• 阅读 923

1.7 出错处理

当UNIX系统函数出错时,通常会返回一个负值。error.h中定义了errno以及可以赋予它的各种常量,这些常量都以字符E开头。

对于errno应当注意两条规则:

  1. 如果没有出错,其值不会被例程清除。因此,仅当函数的返回值指明出错时,才检验其值。
  2. 任何函数都不会将errno值设置为,而且在error.h中定义的所有常量都不为0。

C标准定义了两个函数,用于打印出错信息。

#include <string.h>
char *strerror(int errnum);

strerror函数将errnum映射为一个出错消息字符串,并返回此字符串的指针。

#include <stdio.h>
void perror(const char *msg);

perror函数基于error的当前值,在标准错误上产生一条出错信息,然后返回。首先输出msg指向的字符串,然后是一个冒号,一个空格,接着是对应于error值的出错消息,最后是一个换行符。

Page12 实例

#include "apue.h"
#include <errno.h>

int main(int argc, char *argv[])
{
    fprintf(stderr, "EACCES: %s\n", strerror(EACCES));
    errno = ENOENT;
    perror(argv[0]);
    exit(0);
}

执行时,将打印

EACCES: Permission denied
./main: No such file or directory

出错恢复

可以将errno.h中定义的各种出错分成两类,致命性的和非致命性的。
对于致命性错误,无法执行恢复操作。最多能在屏幕上打印一条出错消息或将一条出错消息写入日志文件,然后退出。
对于非致命性错误,有时可以较妥善地进行处理。大多数非致命性错误是暂时的(如资源短缺),当系统中的的活动较少时,这种错误可能不会发生。
与资源相关的非致命性错误包括:EAGAIN、ENFILE、ENOBUFS、ENOLCK、ENOSPC、EWOULBLOCK,有时ENOMEM也是非致命性错误。当EBUSY指明共享资源正在使用时,也可将ta作为非致命性错误处理。当EINTR终端一个慢速系统调用时,可将它作为非致命性错误处理。
对于资源相关的非致命性错误的典型恢复操作是延迟一段时间,然后重试。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Bill78 Bill78
4年前
Python多进程 - 实现多进程的几种方式
方式一:os.fork()coding:utf8"""pidos.fork()1.只用在Unix系统中有效,Windows系统中无效2.fork函数调用一次,返回两次:在父进程中返回值为子进程id,在子进程中返回值为0"""importospidos.fork()ifpid0:
Wesley13 Wesley13
4年前
Oracle基于布尔的盲注总结
0x01decode 函数布尔盲注decode(字段或字段的运算,值1,值2,值3)这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回3当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多使用方法:比较大小select
Wesley13 Wesley13
4年前
MySQL数据库表设计规范
一、数据库设计1、一般都使用INNODB存储引擎,除非读写比率<1%,才考虑使用MYISAM存储引擎;其他存储引擎请在DBA的建议下使用。2、Storedprocedure(包括存储过程,函数,触发器)对于MYSQL来说还不是很成熟,没有完善的出错记录处理,不建议使用。3、UUID(),USER()这样的
Wesley13 Wesley13
4年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Stella981 Stella981
4年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
4年前
Dubbo剖析
一、前言dubbo提供了一些服务降级措施,当服务提供端某一个非关键的服务出错时候,dubbo可以对消费端的调用进行降级,这样服务消费端就避免了在去调用出错的服务提供端,而是使用自定义的返回值直接在在本地返回。二、如何使用服务降级直接返回mock值!(https
Wesley13 Wesley13
4年前
Oracle的使用笔记
1. 虚表dual     虚表是Oracle提供的用于操作函数的方式,属于sys用户,共享给所有用户使用。虚表dual是单行单列的表,表中存放一个常量数据X。     虚表的意义:更方便的操作函数或者查询常量。2\.函数      单行函数:表中的一列作为函数的参数,对于每一条记录,函数都有一个返回值。例如:u
Easter79 Easter79
4年前
Swift3.0 类和结构体的选择
结构体实例总是通过值传递,类实例总是通过引用传递先说说值类型和引用类型的区别值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝在Swift中,所有的结构体和枚举类型都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。引用类型在被赋予到一个变量、常
Wesley13 Wesley13
4年前
C库函数、系统函数等调用错误的处理方法
几乎所有的系统函数和库函数在执行时都会通过返回特定的值来说明成功或出错。我们在调用它们后,必须马上对其返回值进行检测,如果调用出错则要进行相应的处理(一般是向终端输出错误信息并终止程序运行)。否则在今后程序出错时,如果通过调试去定位到该错误将会花费很长的时间。当然也有某些系统调用从不失败(例如getpid()或\_exit()等),在调用它们时可以不
Wesley13 Wesley13
4年前
C++ 里的常用头文件
<assert.h验证程序断言<complex.h支持复数算术运算<ctype.h字符类型<errno.h出错码<fenv.h浮点环境<float.h浮点常量<inttypes.h整型格式转换<iso646.h替代关系操作符宏<limits.h实现常量<locale.h局部类别<