概述

公共头文件<errno.h>定义了一个整型值errno以及可以赋予它的各种常量。

大部分函数出错后返回-1,并且自动给errno赋予当前发生的错误枚举值。

需要注意的一点是,errno只有在错误发生时才会被复写,这就意味着如果按顺序执行AB两个函数,如果只有A函数出错,则执行完AB函数后errno依然保留着A函数出错的枚举值,

如果AB均出错,那么在B之前如果errno没有被处理,那么将会被B出错的枚举值所覆盖。

Linux

为了避免多线程环境共享一个errno,Linux系统定义了一个宏来解决这个问题,这个定义已经定义在<errno.h>系统头文件中。

extern int *__errno_location(void);
#define errno (*__errno_location())

最让人疑惑的是,你可以为此宏赋值,具体解析可以参考这个文章

int main(void)
{
errno = ;
perror("");
errno = ;
perror("");
return ;
}

示例

#include <error.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>

/*Already define in <error.h>*/
/*extern int *__errno_location(void);
#define errno (*__errno_location())*/ char buf[]; int main(void)
{
int re, my_errno; re = read(, buf, sizeof(buf));
if(re > -){
my_errno = ;
}else{
my_errno = errno;
perror("file error");
}
printf("%d\n", my_errno); re = ;
re = open("./not_exists_file", O_RDONLY);
if(re > -){
my_errno = ;
}else{
my_errno = errno;
perror("file error");
}
printf("%d\n", my_errno);
return ;
}

以上代码输出:

file error: Bad file descriptor

file error: No such file or directory

[Linux]出错处理errno的更多相关文章

  1. Linux中errno使用 - [Linux]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://www.blogbus.com/wzgyantai-logs/24470871.html 当linux中的C api函数发 ...

  2. linux 下errno各个值的意义(转) errno.h

    strerror(errno):获取errno对应的错误 查看错误代码errno是调试程序的一个重要方法.当linux C api函数发生异常时,一般会将errno变量(需include errno. ...

  3. linux中errno使用(转)

    当linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招解决了不少 ...

  4. linux中errno及perror的应用

    1 perror 定义在头文件<stdlib.h>中 void perror(const char *s);函数说明 perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 ...

  5. Linux中errno的含义

    /****************************获取错误代码描述**************/ #include <string.h>#include <errno.h&g ...

  6. UNIX环境编程学习笔记(1):——出错处理errno

    lienhua342014 年 8 月 24 日 1. errno变量 文件 <errno.h> 中定义了符号 errno 以及可以赋予它的各种常量,这些常量都是以字符 E 开头.例如,若 ...

  7. Linux C高级编程——文件操作之系统调用

    Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神是无限的.           库函数是一些完毕特定功能的函数.一般由某个标准组织制作公布,并形成一定的标准.使用库函数编 ...

  8. 转:socket编程在windows和linux下的区别

    如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境. 下面大概分几个方面进行罗 ...

  9. socket编程在windows和linux下的区别

    如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境. 下面大概分几个方面进行罗 ...

随机推荐

  1. Java数据库学习之SQL语句动态拼接

    public class UserDaoImpl implements UserDao { @Override public List<User> getUserByPage(PageIn ...

  2. mongodb解决只能本地连接不能远程连接问题

    本机windows7 ,装了vagrant盒子,并在盒子上装了mongodb服务,本机连接虚拟机时连不上. 解决方法: 修改虚拟机上 mongodb.conf 文件,将bind_ip = 127.0. ...

  3. linux cp 直接覆盖不提示信息 解决方法

    默认情况下,cp覆盖时,无论加什么参数 -f 之类的 还是提示是否覆盖. 原因是:服务器会默认增加别名 alias cp=’cp -i’,当你执行cp时,其实执行的是cp –i. [root@ltt0 ...

  4. servlet(5) HttpSession

    Servlet 提供的 HttpSession 接口,提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式. Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP ...

  5. MonkeyRunner 综合实践

    综合实践 测试场景 连接设备,自动安装并启动考研帮app 启动后登录账号(账号zxw1234 密码:zxw123456),然后截图并保存到指定文件位置. 思路分析 连接设备 安装app 启动app 输 ...

  6. Windows XP Services

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\

  7. pandas的读写

    import as pd import numpy as np import matplotlib.pyplot as plt #df.to_excel('C:Users/history/Deskto ...

  8. Markdown——入门指南

    导语: Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记 ...

  9. 深度学习中优化【Normalization】

    深度学习中优化操作: dropout l1, l2正则化 momentum normalization 1.为什么Normalization?     深度神经网络模型的训练为什么会很困难?其中一个重 ...

  10. Apicloud学习第四天

    apicloud存储机制,添加和获取存储的数据 $api.setStorage('currentCity', cityList[i_]); $api.getStorage('currentCity') ...