我们知道,系统函数调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面可以迅速得到故障信息。

有两种方式:

1. strerror - 需要将错误信息输出到日志;

2. perror - 不需要将错误信息输出到日志。


一、strerror

#include <errno.h>

#include <string.h>

char * strerror (int errnum);     /* See NOTES */

errnum:

传入参数,错误编号的值,一般取 errno 的值;

返回值

错误原因;

作用:

调用任何系统函数,当出错后,系统都会将错误代号赋值给全局变量errno,当出现错误后,我们就可以使用函数strerror,传参errno,就会返回对应的出错信息了。

具体使用案例:

fprintf(stderr, "error, reason: %s\n", strerror(errno));

为什么说,需要将错误信息输出到日志文件时要使用strerror函数呢,因为strerror函数转换后返回char *指针,我们拿到这个指针后就可以将这个指针字符串写入日志文件中去啦。

下面会讲解为什么使用perno函数就不可以这样操作!

例:

1. 打开文件失败

#include <errno.h>         // errno
#include <string.h>        // strerror
#include <stdio.h>         // printf
#include <stdlib.h>        // exitint main (int argc, char *argv[]) {FILE *fp = NULL;fp = fopen("./123/test.txt", "r");if (NULL == fp) {char *err = strerror(errno);fprintf(stderr, "open file error, reason: %s\n", err);//fprintf(stderr, "open file error, reason: %s\n", strerror(errno));exit(-1);}printf("open file success!\n");return 0;
}

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
open file error, reason: No such file or directory

其中,“No such file or directory” 就是我们通过strerror函数获取到的错误信息!

2. 创建socket失败

#include <stdio.h>         // printf
#include <sys/types.h>     // socket
#include <sys/socket.h>    // socket
#include <stdlib.h>        // exit
#include <errno.h>         // errno
#include <string.h>        // strerrorint main (int argc, char *argv[]) {int sock = 0;sock = socket(-1, SOCK_STREAM, 0);if (-1 == sock) {fprintf(stderr, "create socket error, reason: %s\n", strerror(errno));exit(-1);}return 0;
}

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
create socket error, reason: Address family not supported by protocol

其中,“Address family not supported by protocol” 就是我们通过strerror函数获取到的错误信息!


二、perror

#include <stdio.h>

#include <errno.h>

void perror (const char *s);    /* See NOTES */

s:

传入参数,自定义的描述;

返回值:

无;

作用:

向标准出错stderr 输出错原因 。

具体使用案例:

perror("create socket error ");

将需要提示的字符串传参给perror函数即可,它相当于:

fprintf(stderr, "create socket error : ", strerror(errno));

perror是直接向出错标准stderr输出错误原因!

例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>int main (int argc, char *argv[]) {int sock = 0;sock = socket(-1, SOCK_STREAM, 0);if (-1 == sock) {perror("create socket error ");exit(-1);}return 0;
}

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
create socket error : Address family not supported by protocol

其中,“Address family not supported by protocol” 就是我们通过perror函数输出的错误信息!

因为他是直接向出错标准stderr输出错误原因,我们没法通过它获得错误信息字符串,所以也就没法将其写入日志文件中!


最后,调用系统的任何函数,当出现了错误,都可以使用以上两种方式进行打印输出错误信息,从而更轻易的帮助我们找出对应问题!

如果需要将错误信息输出到日志文件,使用strerror 函数;否则可以使用perror函数。

注意:以上介绍的 适用于任何Linux函数,例如open、write等。

完!

C/C++ Linux 出错处理函数(strerror 与 perror)相关推荐

  1. C语言函数:错误信息打印函数,strerror()与perror()

    C语言函数:错误信息打印函数,strerror()与perror() strerror: C语言函数: 字符串函数及模拟实现strtok().strstr().strerror()_srhqwe的博客 ...

  2. linux下的strerror和perror

    strerror和perror用于获取error相关的错误信息,strerror接受一个int,perror接受一个字符串. #include <stdio.h> #include < ...

  3. C语言错误信息报告函数strerror、perror的使用

    strerror char * strerror ( int errnum ); 返回错误码,所对应的错误信息.(是把错误码转化为对应的错误信息) #include <errno.h>// ...

  4. 出错处理函数abort、exit、atexit、strerror

    出错处理函数abort.exit.atexit.strerror. . .2010-06-30 22:43摘要:本文详细讲述了几个出错处理的函数abort.exit.atexit.strerror函数 ...

  5. strerror和perror函数详解

    /*#include <string.h> char *strerror(int errnum); 它返回errnum的值所对应的错误提示信息,例如errnum等于12的话,它就会返回&q ...

  6. 引用 linux ioctl函数

    http://vic295.blog.163.com/blog/static/74033530200991974322689/ 引用 linux ioctl函数 2009-10-19 19:43:22 ...

  7. Linux系统函数之IO函数

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...

  8. Linux时间函数札记

    关于gmtime.gmtime_r.localtime.localtime_r 测试环境:vmware 7 + Redhat5.5,系统时间使用UTC,时区为上海. 1.函数功能介绍 使用man gm ...

  9. Linux API函数总结

    (一)文件操作篇 1.creat(建立文件) 头文件 1 #include<sys/types.h> 2 #include<sys/stat.h> 3 #include< ...

最新文章

  1. 目标检测--Accurate Single Stage Detector Using Recurrent Rolling Convolution
  2. Centos6 安装NTP 4.2.8 服务器
  3. POJ 3057 Evacuation(二分匹配)
  4. 服务器健康监控管理系统,一种远程健康监控系统服务器
  5. ASP.NET中使用一般处理程序ashx作为后台处理实现响应get和post请求
  6. mysql5.7.17配置_mysql-5.7.17-winx64的安装配置
  7. 关注 Imagine Cup 2010, 参与软件设计“最具人气奖”投票
  8. android弹出键盘高度,Android 解决全面屏 软键盘弹出会有高度约50dp的白条。
  9. 《深度学习》李宏毅 -- task7总结
  10. 23种设计模式(十五)接口隔离之适配器
  11. 多继承完美闪避成员名冲突的问题
  12. 数据结构之红黑树插入案例详解
  13. 初学 PS 手绘入门小技巧整理【持续更新】
  14. 汇编语言期末复习不挂科——知识点总结
  15. C语言之“输出100~200之间的素数”
  16. HDU 2826 || The troubles of lmy(判断两个N边形是否相似
  17. avl二叉树 java_平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现
  18. 【TensorFlow基础操作笔记】图+对话+张量+变量+线性回归实例
  19. 使用C#.NET通过MAPI访问收件箱
  20. 熬夜读完这份高分宝典,四面字节之后成功拿下

热门文章

  1. 第二十三章 天猫精灵控制ESP32(wifi+tcp+json)
  2. Java8日期/时间使用
  3. 概率分析方法与推断统计(来自我写的python书)
  4. 使用Android Studio搭建Android源码查看工具
  5. 7 SY Vue 原理 副本 页面编辑错误
  6. 提高模型泛化能力的几大方法
  7. Linux命令_ps 进程管理
  8. 《Unity 3D脚本编程:使用C#语言开发跨平台游戏》序言
  9. Exynos 4412 看门狗定时器中断
  10. 苏州博物馆计算机系统操作工,行车及铁钢包调度系统在炼钢厂应用.doc