检查errno

转自  http://blog.csdn.net/todd911/article/details/9132095

很多库函数,特别是那些与操作系统有关的,当执行失败时会通过一个名称为errno的外部变量,通知程序该函数调用失败。

下面的代码利用这一特性进行错误处理:

[cpp] view plaincopy

  1. errno = 0;
  2. /
  3. /*调用库函数*/
  4. if(errno)
  5. /*处理错误*/

上面的处理是错误的。

要理解这一点,我们不妨假想一下库函数fopen在调用时可能会发生什么情况,当fopen函数为要求新建一个文件以供程序输出,
如果已经存在一个同名文件,fopen函数将先删除它,然后新建一个文件,这样fopen函数可能需要调用其他的库函数来检测同名
文件是否已经存在。假设用于检测文件的库函数在文件不存在时,会设置errno,那么,fopen函数每次新建一个事先并不存在的
文件时,及时没有任何程序错误发生,errno也仍然可能被设置。
因此,在调用库函数是,我们应该先检测作为错误指示的返回值,确定程序执行已经失败,然后再检查errno:

[cpp] view plaincopy

    1. /*调用库函数*/
    2. if(返回的错误值)
    3. /* 检查errno值*/
时间: 2024-08-05 02:36:30

检查errno的相关文章

【C语言天天练(二三)】errno变量

引言: 在C编程中,errno是个不可缺少的变量,特别是在网络编程中.如果你没有用过errno,那只能说明你的程序不够健壮. 为什么会使用errno呢?这是系统库设计中的一个无奈之举,他更多的是个技巧,而不是架构上的需要.我们观察下函数结构,可以发现,函数的参数返回值只有一个,这个返回值一般可以携带错误信息,比如负数表示错误,而正数表述正确的返回值,比如recv函数.但是对于一些返回指针的函数,如:char *get_str():这个方法显然没有用的.NULL可以表示发生错误,但是发生什么错误却

errno 错误码

转自:http://baike.baidu.com/link?url=uX-q7K-TTL-5AFNT-hjhAP6fvgAwvsNkIMqJqJ3GEspYgtQXsovEEzpqmQ3ZmAgql2uG3LluUetAp8uKTm3z5q errno 是记录系统的最后一次错误代码.代码是一个int型的值,在errno.h中定义 NAME 编辑 errno - number of last error if (somecall() == -1) { printf("somecall() fai

对于linux下system()函数的深度理解(整理)

对于linux下system()函数的深度理解(整理) (2013-02-07 08:58:54) 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为是其他的代码影响到这个,或是内核驱动文件系统什么的异常导致,昨天有出现了这个问题,就随手百了一下度,问题出现了,很多人都说system()函数要慎用要少用要能不用则不用,system()函数不稳定?

linux下进程相关操作

一.定义和理解 狭义定义:进程是正在运行的程序的实例. 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动. 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域.数据区域和堆栈区域.文本区域存储处理器执行的代码:数据区域存储变量和进程执行期间使用的动态分配的内存:堆栈区域存储着活动过程调用的指令和本地变量. 第二,进程是一个“执行中的程序”.程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们

解析如何在C语言中调用shell命令的实现方法【转】

本文转自:http://www.jb51.net/article/37404.htm 1.system(执行shell 命令)相关函数 fork,execve,waitpid,popen表头文件 #include<stdlib.h>定义函数 int system(const char * string);函数说明 system()会调用fork()产生子进程,由子进程来调用/bin/sh-cstring来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程.在调用syst

[C和指针]第四部分

第十一章 高级指针话题 第十二章 预处理器 第十三章 输入/输出函数 第十一章            高级指针话题 指向指针的指针 int i; int *pi; int **ppi; 变量i 是一个整数,pi是一个指向整型指针,ppi是一个指向pi的指针,所以它是一个指向整型的指针的指针. ppi = π这条语句把ppi初始化为指向变量pi. *ppi = &i;这条语句把pi(通过ppi间接访问)初始化为指向变量i.经过上面两条语句之后: 现在,下面各语句具有相同的效果(都是将变量i的值赋值

标准IO

标准IO由ISO C 标准的IO库,它处理了很多底层细节,比如合适的缓冲大小等等,因此更易于使用,但是也引入了一些其他问题. 流向 标准IO使用FILE对象关联流,流可以是面向宽字节的也可以是面向单字节的,当流初始化的时候是没有方向的,如果后面的IO操作是处理的宽字符集的,流变成面向宽字节的,如果哦是处理单字节的,流变成面向单字节,一旦流有了方向,不可改变,直到流被关闭,fwide可以设置流的方向,freopen可以清楚流的方向. #include <wchar.h> int fwide(FI

【转】Linux下socket keep alive讲解

[需求]不影响服务器处理的前提下,检测客户端程序是否被强制终了.[现状]服务器端和客户端的Socket都设定了keepalive属性.服务器端设定了探测次数等参数,客户端.服务器只是打开了keepalive机能服务器端起了一个监视线程,利用select来检测socket是否被关闭... 下面这是我的一点肤浅理解. 1.关于keep alive 无论windows,还是linux,keepalive就三个参数: sk->keepalive_probes:探测次数sk->keepalive_tim

让你提前认识软件开发(23):如何在C语言中执行shell命令?

第1部分 重新认识C语言 如何在C语言中执行shell命令? [文章摘要] Linux操作系统具备开源等诸多优秀特性,因此在许多通信类软件(主流开发语言为C语言)中,开发平台都迁移到了Linux上,同时shell操作在Linux的编程中占有很重要的地位,这就需要开发人员熟练掌握在C语言中执行shell命令的相关操作. 本文用实际的代码演示了如何在C语言程序中执行shell命令,为相关软件开发工作的开展提供了参考. [关键词] Linux  C语言  shell  命令  开发 一.程序执行流程