Linux 系统应用编程——出错处理(errno)

1. errno变量
     文件 <errno.h> 中定义了符号 errno 以及可以赋予它的各种常量,这些常量都是以字符 E 开头。例如,若 errno 等于常量 EACCES,表示产生了权限问题(例如,没有打开所要求文件的足够权限)。

      当 UNIX 函数出错时,常常返回一个负值,而且将整型变量 errno 设置成含有附加信息的各个常量。例如,open 函数如果成功执行则返回一个非负文件描述符,如出错则返回 -1。在 open 出错时,有大约 15 种不同的errno 值(文件不存在、权限问题等)。

对于 errno 应该知道两条规则:

规则一:如果没有出错,则errno的值不会被一个例程清除。
因此,仅当函数的返回值指明出错时,才校验 errno 的值。

规则二:任一函数都不会将errno的值设置为0,在<errno.h>中定义的所有常量都不为0。

 

出错标志 errno 是一个整型数值,这个对于用户提示不够有好。C 标准定义了两个函数,用于帮助打印出错信息:

1)、strerror()

[cpp] view plaincopy
  1. #include <string.h>  
  2. #include <errno.h>  
  3.   
  4. char *strerror(int errnum);  

返回值:指向消息字符串的指针

此函数将 errnum(它通常就是 errno 值)映射为一个出错信息字符串,并且返回此字符串的指针。

2)、perror()
perror 函数基于 errno 的当前值,在标准出错上产生一条出错信息,然后返回。

[cpp] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. void perror(const char *msg);  

它首先输出由 msg 指向的字符串,然后是一个冒号,一个空格,接着是对应于 errno 值的出错信息,最后是一个换行符。

例子:

下面代码展示了这两个出错函数的使用方法::

[cpp] view plaincopy
  1. #include <string.h>  
  2. #include <stdio.h>  
  3. #include <errno.h>  
  4. #include <stdlib.h>  
  5. int  
  6. main(int argc, char *argv[])  
  7. {  
  8.     fprintf(stderr, "EACCES: %s\n", strerror(EACCES));  
  9.     errno = ENOENT;  
  10.     perror(argv[0]);  
  11.     exit(0);  
  12. }  

执行结果如下:

[cpp] view plaincopy
  1. fs@ubuntu:~/qiang/error$ ./error   
  2. EACCES: Permission denied  
  3. ./error: No such file or directory  
  4. fs@ubuntu:~/qiang/error$   

 
2. 打印所有错误信息

C 标准库定义了sys_nerr 用于记录错误信息总个数,下面程序通过循环来打印所有信息。

[cpp] view plaincopy
  1. #include <string.h>  
  2. #include <stdio.h>  
  3. #include <errno.h>  
  4. #include <stdlib.h>  
  5. int main(int argc, char *argv[])  
  6. {  
  7.     int idx = 0;  
  8.     for (idx = 0; idx < sys_nerr; idx++) {  
  9.         printf("Error #%3d: %s\n", idx, strerror(idx));  
  10.     }  
  11.     exit(0);  
  12. }  

执行结果如下:

[cpp] view plaincopy
  1. fs@ubuntu:~/qiang/error$ ./print_err   
  2. Error #  0: Success  
  3. Error #  1: Operation not permitted  
  4. Error #  2: No such file or directory  
  5. Error #  3: No such process  
  6. Error #  4: Interrupted system call  
  7.   
  8. ....  
  9.   
  10. Error #132: Operation not possible due to RF-kill  
  11. Error #133: Unknown error 133  
  12. Error #134: Unknown error 134  
  13. fs@ubuntu:~/qiang/error$   


3. 多线程扩展
在支持线程的环境中,多个线程共享进程地址空间,每个线程都有属于它自己的局部 errno 以避免一个线程干扰另一个线程。

函数 strerror() 不是线程安全的。因为该函数将 errnum 对应的字符串保存在一个静态的缓冲区中,然后将该缓冲区的指针返回。另一个线程调用 strerror() 就会重新设置静态缓冲区的内容。

 

4. 出错恢复
可将 <errno.h> 中定义的各种出错分成致命性的和非致命性的两类。对于致命性的错误,无法执行恢复动作,最多只能在用户屏幕上打印出一条出错信息,或者将一条出错信息写入日志文件,然后终止。而对于非致命性的错误,有时可以较妥善地进行处理。

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

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

相关文章

有关MSHTML

http://msdn.microsoft.com/zh-HK/library/aa741322有关MHTML的接口参考文档转载于:https://blog.51cto.com/amcto111/1284453

[Android]在Dagger 2中使用RxJava来进行异步注入(翻译)

以下内容为原创&#xff0c;欢迎转载&#xff0c;转载请注明 来自天天博客&#xff1a;http://www.cnblogs.com/tiantianbyconan/p/6236646.html 在Dagger 2中使用RxJava来进行异步注入 原文&#xff1a;http://frogermcs.github.io/async-injection-in-dagger-2-with-rxjava 几…

关于Go语言在服务端做Restful接口和socket通信

请到我的个人博客看golang rest相关文章 http://xiaorui.cc关于Go语言在服务端做Restful接口和socket通信已经转到: http://xiaorui.cc/2014/10/25/%E5%85%B3%E4%BA%8Ego%E8%AF%AD%E8%A8%80%E5%9C%A8%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%81%9Arestful%E6%8E%A5%E5%8F%A3%E5%92%8C…

Linux 系统应用编程——文件I/O

Linux操作系统是基于文件概念的。文件是以字符序列构成的信息载体。根据这一点&#xff0c;可以把I/O设备当做文件来处理&#xff0c;因此&#xff0c;在磁盘上的普通文件进行交互所用的统一系统调用可以直接用于I/O设备。这样大大简化了系统对于不同设备的处理&#xff0c;提高…

Socket模型详解

Socket模型详解 Winsock 的I/O操作&#xff1a;1、两种I/O模式 阻塞模式&#xff1a;执行I/O操作完成前会一直进行等待&#xff0c;不会将控制权交给程序。套接字默认为阻塞模式。可以通过多线程技术进行处理。 非阻塞模式&#xff1a;执行I/O操作时&#xff0c;Winsock函数会…

UVa 11136 - Hoax or what

题目大意&#xff1a;超市进行促销活动&#xff0c;顾客可以把账单放到一个箱子里&#xff0c;每天超市会从箱子中抽出最高消费者和最低消费者&#xff0c;最高消费者可以得到&#xff08;最高消费-最低消费&#xff09;的金钱。询问超市在n天的促销活动结束后应支付多少钱。 找…

静态库和动态库的分析

在Linux操作系统中&#xff0c;普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式。ELF&#xff08;Executable and Linking Format&#xff0c;可执行连接格式&#xff09;。 ELF文件格式包括三种主要的类型&#xff1a;可执行文件、可重定向文件、共享库&#xff1…

Linux替换命令

:s/^.*$/\L&/100 &#xff03;&#xff03;将100行内的小写转换成大写 vi/vim 中可以使用 :s 命令来替换字符串。 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第…

bash中时间、日期操作

From: Linux 使用 date 計算時間(昨天、明天) 偶尔要算算时间&#xff0c;转载一下&#xff0c;不用再去man了 昨天 (前一天) date –date’1 days ago’ “%Y-%m-%d”date -d ’1 days ago’ “%Y-%m-%d”date -d yesterday “%Y-%m-%d” 明天 (後一天) date –date’1 days…

如何用Chrome浏览器下载网页音乐视频

打开网页&#xff0c;先让要下载的视频播放&#xff0c;右键单击选择审查元素&#xff08;F12&#xff09;&#xff0c;选择上方的Network选项&#xff0c;按F5刷新&#xff0c;这个时候我们可以看到框架中Size下的不少文件数据数字正在变大&#xff0c;按size降序排列。点击表…

Linux 系统应用编程——标准I/O

标准I/O的由来 标准I/O指的是ANSI C 中定义的用于I/O操作的一系列函数。 只要操作系统安装了C库&#xff0c;标准I/O函数就可以调用。换句话说&#xff0c;如果程序中使用的是标准I/O函数&#xff0c;那么源代码不需要任何修改就可以在其他操作系统下编译运行&#xff0c;具有更…

GitLab五种权限

From: https://blog.csdn.net/chenguanghan123/article/details/100523824

Winfrom实现圆角设计

主要代码 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Paint(object sender, PaintEventArgs e) { Type(this, 25, 0.1); } private void…

Linux 系统应用编程——进程基础

一、Linux下多任务机制的介绍 Linux有一特性是多任务&#xff0c;多任务处理是指用户可以在同一时间内运行多个应用程序&#xff0c;每个正在执行的应用程序被称为一个任务。 多任务操作系统使用某种调度(shedule)策略&#xff08;由内核来执行&#xff09;支持多个任务并发执行…

[正则] - 学习过程1

1. 判断是否以xxxx开头: 以数字. 开头&#xff0c;如“2. ” if re.match(^\d\. , content):return <h3>%s</h3> %(content) 2. 将内容中以[ dsfda789 df ] 的内容替换成tpl index 0 input {w: 60 # input宽度 }def replaceValue(matched):global i…

【Python文件处理】递归批处理文件夹子目录内所有txt数据

因为有个需求&#xff0c;需要处理文件夹内所有txt文件&#xff0c;将txt里面的数据筛选&#xff0c;重新存储。 虽然手工可以做&#xff0c;但想到了python一直主张的是自动化测试&#xff0c;就想试着写一个自动化处理数据的程序。 一.分析数据格式 需要处理的数据是txt格式存…

Windows Azure 之服务总线中继服务

Windows Azure的服务总线允许在Web服务内部与外部之间做成一个公共的连接点&#xff0c;在无需更改企业防火墙或者其他安全配置的情况下连接内部和外部的服务 而使用Azure云服务的时候由于缩放的原因通过IP来制定连接也是不科学的&#xff0c;而中继服务则可以充当很好的公共连…

C#对char[]的处理

先来看一段简单的C#代码&#xff1a; private void button3_Click(object sender, EventArgs e){char[] a new char[6] { h, e, L, O, \0, \0 }; // 少赋值一个元素都会报错string b new string(a);string result String.Format("b {0}, b.Length {1}",…

Centos7 关闭防火墙(Firewalld ),使用防火墙(iptables)

1、直接关闭防火墙 systemctl stop firewalld.service&#xff1b; #停止firewall systemctl disable firewalld.service&#xff1b; #禁止firewall开机启动 2、安装并启动 iptables service&#xff0c;以及设置开机自启 yum -y install iptables-services&#xff1b;#安装i…

【qt】QT 的信号与槽机制

QT 是一个跨平台的 C GUI 应用构架&#xff0c;它提供了丰富的窗口部件集&#xff0c;具有面向对象、易于扩展、真正的组件编程等特点&#xff0c;更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上。 QT 支持下列平台&#xff1a;MS/WINDOWS-9…