//   输出至标准出错文件的出错处理函数static void err_doit(int, int, const char *, va_list);

/*
 * Nonfatal error related to a system call
 * Print a message and return
 */
void err_ret(const char *fmt, ...)
{
   va_list ap;

   va_start(ap, fmt);
   err_doit(, errno, fmt, ap);
   va_end(ap);
}

/*
 *  Fatal error related to a system call
 *  Print a message and terminate
 *
 */
void err_sys(const char *fmt, ...)
{
   va_list ap;

   va_start(ap, fmt);
   err_doit(, errno, fmt, ap);
   va_end(ap);
   exit();
}

/*
 * Fatal error unrelated to a system call
 * Error code passed as explict parameter
 * Print a message and terminate
 */
void err_exit(int error, const char *fmt, ...)
{
   va_list ap;

   va_start(ap, fmt);
   err_doit(, error, fmt, ap);
   va_end(ap);
   exit();
}

/*
 * Fatal error related to a system call
 * Print a message, dump core, and terminate
 *
 */
void err_dump(const char *fmt, ...)
{
   va_list ap;

   va_start(ap, fmt);
   err_doit(, errno, fmt, ap);
   va_end(ap);
   abort();          /* dump core and terminate */
   exit();          /* shouldn't get here */
}

/*
 * Nonfatal error unrelated to a system call
 * Print a message and return
 */
void err_msg(const char *fmt, ...)
{
   va_list ap;

   va_start(ap, fmt);
   err_doit(, , fmt, ap);
   va_end(ap);
}

/*
 * Fatal error unrelated to a system call
 * Print a message and terminate
 */
void err_quit(const char *fmt, ...)
{
   va_list ap;

   va_start(ap, fmt);
   err_doit(, , fmt, ap);
   va_end(ap);
   exit();
}

static void err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
   char buf[MAXLINE];
   vsnprintf(buf, MAXLINE, fmt, ap);
   if  (errnoflag)
      snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ":%s",
                 strerror(error));
   strcat(buf, "\n");
   fflush(stdout);             /* in case stdout and stderr are the same */
   fputs(buf, stderr);
   fflush(NULL);               /* flushes all stdio  output streams */
}

APUE中对出错函数的封装的更多相关文章

  1. JS —— 轮播图中的缓动函数的封装

    轮播图的根本其实就是缓动函数的封装,如果说轮播图是一辆跑动的汽车,那么缓动函数就是它的发动机,今天本文章就带大家由简入繁,封装属于自己的缓动函数~~ 我们从需求的角度开始,首先给出一个简单需求: 1. ...

  2. openswan中out_sa()函数报文封装思想

    out_sa()函数报文封装思想讲解 1. out_sa前言 我已经在上一篇文章中将in_struct函数的基本原理进行了阐述,而out_struct()的实现基本是相同的,如果能理解in_struc ...

  3. 辛巴学院-Unity-剑英陪你零基础学c#系列(四)函数和封装

    辛巴学院:正大光明的不务正业. 国庆长假结束了,我的心情是这样的: 你总是起不早,起不早独自一个人沉睡到天亮你无怨无悔的梦着那副本我知道你根本就不想上班你总是起不早,起不早放假总是短暂,上班太难请个病 ...

  4. Linux 编程中的API函数和系统调用的关系【转】

    转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...

  5. Delphi中的四舍五入函数

    一.Delphi中的四舍五入法     四舍五入是一种应用非常广泛的近似计算方法,针对不同的应用需求,其有算术舍入法和银行家舍入法两种.     所谓算术舍入法,就是我们通常意义上的四舍五入法.其规则 ...

  6. JavaScript中的Generator函数

    1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...

  7. C语言基础知识:几种特殊的函数宏封装方式

    函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销. 函数宏本质上为宏,可以直接进行定义,例如: #define INT ...

  8. Entity Framework 6 Recipes 2nd Edition(10-5)译 -> 在存储模型中使用自定义函数

    10-5. 在存储模型中使用自定义函数 问题 想在模型中使用自定义函数,而不是存储过程. 解决方案 假设我们数据库里有成员(members)和他们已经发送的信息(messages) 关系数据表,如Fi ...

  9. C语言中的回调函数(Callback Function)

    1 定义和使用场合 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数.函数是你实现 ...

随机推荐

  1. 粗看ES6之数组

    标签: javascript es6 数组新增方法 map(可以理解为是映射,以一定规则修改数组每一项并返回全新数组) reduce(可以理解为是汇总,一堆出来一个) filter(可以理解为过滤,筛 ...

  2. jQuery的表单验证

    jQuery的表单验证 直接上代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  3. mui打包vue项目

    1,新建app项目,打包vue,修改config/index.js的输出路径 2,把build打包后的dist目录下的文件拷到app目录下 3.修改app下面的index文件,改变压缩格式,修改“/s ...

  4. 使用uwsgi启动django项目

    在 manage.py 同级目录 创建 uwsgi.ini 文件 ,内容如下: [uwsgi] # 对外提供 http 服务的端口 http = :18123 #the local unix sock ...

  5. php的yii框架开发总结1

    最近用php的yii框架写了一个小的demo,虽然不复杂,但是也学习了很多东西,现在总结一下. 项目需求:为几个教研室写一个日报系统,每个人每天写日报,并且系统有自动实现发邮件功能. 额外要求:1.人 ...

  6. 16 Javascript

    网上找网页模板: 1.HTML模板 2.BootStrap 前面内容总结 HTML 标签:块级,行内 CSS 后台管理布局 position: fixed  ---永远固定在窗口的某个位置 relat ...

  7. navicat for mysql注册码:NAVN-LNXG-XHHX-5NOO

    名.组织可以为空或任意填写. 摘自: navicat for mysql10.0.0.0注册码中“名”.“组织”...._百度知道

  8. 94. Binary Tree Inorder Traversal(inorder ) ***(to be continue)easy

    Given a binary tree, return the inorder traversal of its nodes' values. Example: Input: [1,null,2,3] ...

  9. 257. Binary Tree Paths (dfs recurive & stack)

    Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...

  10. pt-table-sync

    高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据.他可以同步单个表,也可以同步整个库.它不同步表结构.索引.或任何其他模式对象.所以在修复一致性之前需要保证他们表存在.   使用范例: ...