C/C++ Linux 出错处理函数(strerror 与 perror)
我们知道,系统函数调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面可以迅速得到故障信息。
有两种方式:
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)相关推荐
- C语言函数:错误信息打印函数,strerror()与perror()
C语言函数:错误信息打印函数,strerror()与perror() strerror: C语言函数: 字符串函数及模拟实现strtok().strstr().strerror()_srhqwe的博客 ...
- linux下的strerror和perror
strerror和perror用于获取error相关的错误信息,strerror接受一个int,perror接受一个字符串. #include <stdio.h> #include < ...
- C语言错误信息报告函数strerror、perror的使用
strerror char * strerror ( int errnum ); 返回错误码,所对应的错误信息.(是把错误码转化为对应的错误信息) #include <errno.h>// ...
- 出错处理函数abort、exit、atexit、strerror
出错处理函数abort.exit.atexit.strerror. . .2010-06-30 22:43摘要:本文详细讲述了几个出错处理的函数abort.exit.atexit.strerror函数 ...
- strerror和perror函数详解
/*#include <string.h> char *strerror(int errnum); 它返回errnum的值所对应的错误提示信息,例如errnum等于12的话,它就会返回&q ...
- 引用 linux ioctl函数
http://vic295.blog.163.com/blog/static/74033530200991974322689/ 引用 linux ioctl函数 2009-10-19 19:43:22 ...
- Linux系统函数之IO函数
技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...
- Linux时间函数札记
关于gmtime.gmtime_r.localtime.localtime_r 测试环境:vmware 7 + Redhat5.5,系统时间使用UTC,时区为上海. 1.函数功能介绍 使用man gm ...
- Linux API函数总结
(一)文件操作篇 1.creat(建立文件) 头文件 1 #include<sys/types.h> 2 #include<sys/stat.h> 3 #include< ...
最新文章
- 目标检测--Accurate Single Stage Detector Using Recurrent Rolling Convolution
- Centos6 安装NTP 4.2.8 服务器
- POJ 3057 Evacuation(二分匹配)
- 服务器健康监控管理系统,一种远程健康监控系统服务器
- ASP.NET中使用一般处理程序ashx作为后台处理实现响应get和post请求
- mysql5.7.17配置_mysql-5.7.17-winx64的安装配置
- 关注 Imagine Cup 2010, 参与软件设计“最具人气奖”投票
- android弹出键盘高度,Android 解决全面屏 软键盘弹出会有高度约50dp的白条。
- 《深度学习》李宏毅 -- task7总结
- 23种设计模式(十五)接口隔离之适配器
- 多继承完美闪避成员名冲突的问题
- 数据结构之红黑树插入案例详解
- 初学 PS 手绘入门小技巧整理【持续更新】
- 汇编语言期末复习不挂科——知识点总结
- C语言之“输出100~200之间的素数”
- HDU 2826 || The troubles of lmy(判断两个N边形是否相似
- avl二叉树 java_平衡二叉树之AVL树(Adelson-Velsky and Landis Tree)简介及Java实现
- 【TensorFlow基础操作笔记】图+对话+张量+变量+线性回归实例
- 使用C#.NET通过MAPI访问收件箱
- 熬夜读完这份高分宝典,四面字节之后成功拿下
热门文章
- 第二十三章 天猫精灵控制ESP32(wifi+tcp+json)
- Java8日期/时间使用
- 概率分析方法与推断统计(来自我写的python书)
- 使用Android Studio搭建Android源码查看工具
- 7 SY Vue 原理 副本 页面编辑错误
- 提高模型泛化能力的几大方法
- Linux命令_ps 进程管理
- 《Unity 3D脚本编程:使用C#语言开发跨平台游戏》序言
- Exynos 4412 看门狗定时器中断
- 苏州博物馆计算机系统操作工,行车及铁钢包调度系统在炼钢厂应用.doc