strerror和perror函数详解

/*#include <string.h>
char *strerror(int errnum);
它返回errnum的值所对应的错误提示信息,例如errnum等于12的话,它就会返回"Cannot allocate memory"。
测试程序:*/
#include <stdio.h>
#include <string.h>
#include <errno.h>int main(void)
{int fd = 10;int ret;ret = close(fd);if(ret == -1)//fprintf(stderr, "close error with msg is: %s\n",strerror(errno));这两行输出的结果都是一样的printf("close error with msg is: %s\n",strerror(errno));return 0;
}#include <stdio.h>
#include <string.h>
#include <errno.h>
#include<stdlib.h>
int main(void)
{ extern int errno;int fd = 10;int ret;ret = close(fd);if(ret == -1)printf("errno=%d\n",errno);char * mesg = strerror(errno);printf("Mesg:%s\n",mesg);exit(0);
}
/*[root@linux untitled folder 2]# gcc strerror1.c
[root@linux untitled folder 2]# ./a.out
errno=9
Mesg:Bad file descriptor
[root@linux untitled folder 2]# 
*/


#include <stdio.h>
int main(void)
{int fd = 10;int ret;ret = close(fd);if(ret == -1)perror("close error");return 0;
}
/*[root@linux untitled folder 2]# gcc perror.c
[root@linux untitled folder 2]# ./a.out
close error: Bad file descriptor*/
//函数原型为void perror(const char *s);
 

 

在linux编程中,strerror()是个好东东,因为一个孤零零的errno看不出个所以然,然而strerror()返回的错误描述已经给我们解决问题提供了80%的成功率。但从安全性的角度来讲,strerror_r是更好的选择,因为:
#include <string.h>
char *strerror(int errnum);
int strerror_r(int errnum, char *buf, size_t n);说明,对于函数strerror_r,第一个参数errnum是错误代码,第二个参数buf是用户提供的存储错误描述的缓存,第三个参数n是缓存的大小。
1,在系统编程中错误通常通过函数返回值来表示,并通过特殊变量errno来描述。errno这个全局变量在<errno.h>头文件中声明如下:extern int errno;errno是一个由POSIX和ISO C标准定义的符号,看(用)起来就好像是一个整形变量。当系统调用或库函数发生错误的时候,比如以只读方式打开一个不存在的文件时,它的值将会被改变,根据errno值的不同,我们就可以知道自己的程序发生了什么错误,然后进行相应的处理。为什么,要强调errno看起来好像是一个整形变量呢?因为有的标准(如ISO C)只规定了errno的作用,而没有规定它的实现方式,它可能被定义成一个变量,也有可能被定义成一个宏,这个具体要看编译器自己的实现。早些时候,POSIX.1曾把errno定义成extern int errno这种形式,但现在这种方式比较少见了。因为以这种形式来实现errno,在多线程环境下errno变量是被多个线程共享的,这样可能线程A发生某些错误改变了errno的值,线程B虽然没有发生任何错误,但是当它检测errno的值的时候,线程B会以为自己发生了错误。所以现在errno在Linux中被实现成extern int * __errno_location(void): #define errno (*__errno_location()),这样每个线程都有自己的errno,不会再发生混乱了。关于errno有三点需要特别注意:1、如果系统调用或库函数正确执行的话,errno的值是不会被清零(置0,注意这里是不会被清零,不是不会被改变)的,假若执行函数A的时候发生了错误errno被改变,接下来直接执行函数B,如果函数B正确执行的话,errno还保留函数A发生错误时被设置的值。所以,在利用errno之前,最好先对函数的返回值进行判断,看是否发生了错误,返回值错误再利用errno判断时哪里发生了错误。所以如果一个函数无法从返回值上判断正误,而只能通过errno来判断出错,那你在调用它之前必须手动将errno清零!2、系统调用或库函数正确执行,并不保证errno的值不会被改变!3、任何错误号(即发生错误时errno的取值)都是非0的。综上所述,当需要用errno来判断函数是否正确执行的时候,最好先将errno清零,函数执行结束时,通过其返回值判断函数是否正确执行,若没有正确执行,再根据errno判断时哪里发生了错误。
也可以用这个函数
#include <stdio.h>
函数原型为void perror(const char *s);

 

转载于:https://www.cnblogs.com/leijiangtao/p/4110856.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2018-01-28】HTML-布局

位置&#xff1a; position&#xff1a;fixed 固定 absolute 绝对位置 relative 相对位置 top right     bottom left 流&#xff1a; float&#xff1a;left 向左流 right 向右流 both 清掉流 z-index分层&#xff1a; 值越大越靠上转载于:https://www.cnblogs.com/zqyyx…

关于设计模式——策略模式-Strategy Pattern

文章目录1 策略模式1.1 模拟鸭子1.2 设计原则1.3 整合行为1.4 模拟鸭子代码的代码1.5 动态设定行为1.6 重新查看整体1.7 继承和组合1.8 总结1.9 优劣期间应用场景2.0 参照资料1 策略模式 在我们什么都不会的情况下&#xff0c;我们先无需知道什么是策略模式&#xff0c;我们要…

python (3):wxPython打包app,报错

1&#xff0c;打包app报错 如图&#xff1a; 使用py2app&#xff0c;mac下打包成app。异常。程序直接退出。 没有详细的错误信息&#xff0c;client程序直接崩溃了。 2。原因 代码没有几行&#xff1a; #!/usr/bin/python # -*- coding: utf-8 -*- import wxapp wx.App(False…

.NET Framework 工具

您可以使用 .NET Framework 工具轻松创建、部署和管理面向 .NET Framework 的应用程序和组件。 此节中介绍的大部分 .NET Framework 工具将自动随 Visual Studio 一起安装。 &#xff08;有关安装信息&#xff0c;请参阅 Visual Studio 下载。&#xff09; 可以从命令行运行除程…

并发无锁队列学习(概念介绍)

1、前言 队列在计算机中很重要的一种数据结构&#xff0c;尤其在操作系统中。队列典型的特征是先进先出&#xff08;FIFO&#xff09;&#xff0c;符合流水线业务流程。在进程间通信、网络通信之间常常採用队列做缓存&#xff0c;缓解数据处理压力。结合自己在工作中遇到的队列…

王道操作系统考研笔记——2.1.5 线程概念与多线程模型

文章目录2.1.5 线程概念与多线程模型2.1.5.1 线程的来源2.1.5.2 线程机制带来的变化2.1.5.3 线程的属性2.1.5.4 线程的实现方式2.1.5.5 多线程模型2.1.5.6 小结2.1.5 线程概念与多线程模型 2.1.5.1 线程的来源 在很久以前还没有引入进程之前&#xff0c;系统中的各个程序只能…

mybatis处理集合、循环、数组和in等语句的使用

2019独角兽企业重金招聘Python工程师标准>>> 在Mybatis的xml配置中使用集合&#xff0c;主要是用到了foreach动态语句。 foreach的参数&#xff1a;foreach元素的属性主要有 item&#xff0c;index&#xff0c;collection&#xff0c;open&#xff0c;separator&…

#if defined 和 #if ! defined 的用法

背景&#xff1a;MFC初学&#xff0c;头文件中有#if !defined(AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_)#define AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_// Info : Other content #endif // !defined(AFX_HELLOMFC_H__706D…

Jmeter 通过Groovy保存数据到CSV

def outnew File("D:/pathdt.csv").append("\n"${__threadNum},${要导出的变量},) 转载于:https://www.cnblogs.com/Curious-wang/p/8378373.html

王道操作系统考研笔记——2.1.6 处理机调度的概念和层次

文章目录2.1.6 处理机调度的概念和层次2.1.6.1 调度的基本概念2.1.6.2 高级调度2.1.6.3 中级调度2.1.6.4 进程的挂起态和七状态模型2.1.6.5 低级调度2.1.6.6 三层调度的联系、对比2.1.6.7 小结2.1.6 处理机调度的概念和层次 知识总览 2.1.6.1 调度的基本概念 实际上&#xff…

CocoaPods详解之----使用篇

作者&#xff1a;wangzz 原文地址&#xff1a;http://blog.csdn.net/wzzvictory/article/details/18737437 转载请注明出处 如果觉得文章对你有所帮助&#xff0c;请通过留言或关注微信公众帐号wangzzstrive来支持我&#xff0c;谢谢&#xff01; 一、什么是CocoaPods 1、为什…

placeholder=请输入用户名(六位数字加英文字母)

placeholder"请输入用户名&#xff08;六位数字加英文字母&#xff09;" 转载于:https://www.cnblogs.com/nc-blog/p/4122768.html

文章集锦

不甘平庸的年轻人&#xff0c;全都有同一个特质&#xff1a;http://mp.weixin.qq.com/s/cQhS1nPxbsF3tini0-qvUA转载于:https://www.cnblogs.com/tianboblog/p/8383474.html

数据结构杂谈(五)——栈

本文的所有代码均由C编写 引用及参考资料&#xff1a; 王道数据结构大话数据结构超硬核十万字&#xff01;全网最全 数据结构 代码&#xff0c;随便秒杀老师/面试官&#xff0c;我说的_hebtu666-CSDN博客 5 栈 5.1 引入 在前面学习线性表的时候&#xff0c;我们给出了线性表的…

cocos3.2中如何创建一个场景

1.可以将一些比较通用的东西放到Common.h中,这是一个.h文件,必须手动添加,且保证在classes目录里 #ifndef __COMMON_H__ #define __COMMON_H__#include "cocos2d.h" USING_NS_CC;#define winSize Director::getInstance()->getWinSize() #define CCLog cocos2d::l…

每日一题——Leetcode203 移除链表元素

如果您是第一次看我写的博客&#xff0c;可以给我点个赞并关注我吗&#xff0c;我会持续分享更多有意思的干货。 文章目录1 题目2 思路3 代码4 小结1 题目 Leetcode203 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val …

Linux入门之常用命令(15) lsof

查看磁盘空间&#xff1a; [rootticketb ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 981M 203M 729M 22% / none 16G 0 16G 0% /dev/shm /dev/sda9 2.9G 37M 2.7G 2% /tmp /dev/…

大话重构7:重构是一系列的等量变换

毫无疑问&#xff0c;系统重构是一件如履薄冰、如坐针毡、你必须时时小心应对的工作&#xff0c;你就像走在钢丝上的人&#xff0c;每一步你都必需要保证正确&#xff0c;一个不经意的失误就可能让你万劫不复。虽然如此&#xff0c;仅仅要你掌握了正确的方法。即使站在钢丝上也…

Visual Studio无法查找或打开 PDB 文件解决办法

Visual Studio无法查找或打开 PDB 文件解决办法 用VS调试程序时&#xff0c;有时会在VS底部的“输出”框中提示“无法查找或打开 PDB 文件”。这该怎么解决呢&#xff1f; 下面&#xff0c;我们以VS2013为例&#xff0c;来教大家解决办法。 方法/步骤 1打开VS2013&#xff0c;点…

数据结构杂谈(六)——队列

本文的所有代码均由C编写 六 队列 文章目录六 队列6.1 队列的定义6.2 队列的抽象数据类型6.3 顺序队列&#xff08;循环队列&#xff09;6.3.1 顺序队列的定义及初始化6.3.2 入队6.3.3 出队6.3.4 获取队头元素6.3.5 获取队列长度6.3.6 回过头来6.4 链式队列6.4.1 链式队列的定义…