Unix出错处理

当UNIX系统的函数出错时,通常会返回一个负值。我们判断函数的返回值小于0表示出错了,注意我们并不知道为什么出错。例如我们open一个文件,返回值-1表示打开失败,但是为什么打开失败呢?

原来UNIX维护一个全局变量errno,error通常被设定成具有特定信息的值。回到之前如果文件打开失败,此时读取errno的值为EACCES,表示产生了权限问题。ok此时我们只要检查文件的权限问题。

errno错误代码类型可以通errno的数据手册查询。输入 man errno

特别是在网络编程中。如果你没有用过errno,那只能说明你的程序不够健壮。文件<errno.h>中定义了符合errno以及可以赋予它的各种常量,这些常量都以字符E开头。

POSIX和ISO C将errno定义为这样一个符号,它扩展成为一个可修改的整型左值(lvalue)。这可以是包含出错编号的一个整数,或者是一个返回出错编号指针的函数。以前使用的定义是:

extern int error;

  但是在支持线程的环境中,多个线程共享进程地址空间,每个线程都有属于它自己的局部extern以避免一个线程干扰另一个线程。例如,Linux支持多线程存取errno,将其定义为:

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

C标准定义了两个函数,它们帮助打印出错信息:

#include <string.h>
char *strerror(int errnum);
返回值:指向消息字符串的指针

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

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

#include <stdio.h>
void perror(const char *msg);

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

下面我们用一些代码测试一下

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{ int fd;
char *errmesg;
// test strerror
fd = open(argv[],O_RDWR);// open with write and read
errmesg = strerror(errno);
printf("%s\n",errmesg);
// test perror
fd = open(argv[2],O_RDWR);// open with write and read
perror("result is");
return ;
}

我们先查看home目录下

测试结果如下

errno的错误类型分为致命和非致命的,对于致命的错误一般打印一条消息或者采用syslog方式存储的日志然后退出。对于一些非致命出错,包括EAGIN、ENOBUFS、ENOLCK、等。

常见情况网路编程一般忽略EINIT的中断错误,

EBUSY表面资源正在被占用。

用户表标识

1、用户id,cat/etc/passwd。用户id就是口令登录时用户id,其中0标识超级用户,都是管理员在确定一个用户登录名的同时确定用户id,用户不能修改

2、组id,都是管理员在确定一个用户登录名的时分配。目的让一些不同的用户id的具有相同的组id。这种机制允许同组的各个成员之间共享资源。

组名映射在/etc/group

3、附属id

可以通过getuid()函数获得用户id,可以通过getgid()获得组id

信号

信号singal,用于通知进程发生某种情况。例如,如某一进程执行除法操作,其除数为0,内核会把SIGFPE(浮点异常)的信号发给该进程。进程有一下3中处理信号的方式

1.忽略信号  风险比较大

2.按照系统默认的方式处理,对于浮点异常系统默认关闭进程

3.提供一个函数,信号发生后调用该函数,这被称为捕捉信号,如何异步IO通信

时间值

unix系统使用2中不同时间值

1、日历时间。该值是自协调时间值UTC,1970年1月1日00:00:00至现在所经历的秒数。这个时间可以保存文件最后一次修改的时间

系统基本的数据类型time_t

2、进程时间。也称CPU时间。一般度量进程的执行时间,分成3个进程时间

  • 时钟时间
  • 用户CPU时间
  • 系统CPU时间

时钟时间又称墙上时间,它是进程运行时间的综合。其中与系统运行的进程数有关

用户CPU时间指的用户指令花费的时间,系统cpu时间指的是内核程序所经历的时间,

用户时间+系统时间 = 该进程的运行的总时间 <= 时钟时间

获取的方式输入

time -p 程序

real 时钟时间

user 用户CPU时间

sys 系统cpu时间

由于指令很短是毫秒级或者微秒级的时间 time显示精度不够,所以显示0

2017/4/2(坚持2天一个博客 连载unix的环境编程)

下一篇UNIX标准  http://www.cnblogs.com/smartxuchao/p/6662114.html

Unix环境编程基础下的更多相关文章

  1. UNIX环境编程学习——反思认识

     学习情况: 有关UNIX系统环境编程的学习时间用来非常长的时间.可是感觉效果还是不是太好,在中间经过了期末考试.用来非常长的时间用来学习专业课.就将该过程的学习放到了一边上,放假以后又回家造成了 ...

  2. 【UNIX环境编程、操作系统】孤儿进程和僵尸进程

    基本概念: 在类UNIX系统中,僵尸进程是指完成执行(通过exit系统调用,或运行时发生致命错误或收到终止信号所致)但在操作系统的进程表中仍然有一个进程表表项(进程控制块PCB),处于"终止 ...

  3. UNIX环境编程初步认识——编程环境搭建

     前言 前期学习了Linux的一些基本知识后,在借助前期的学习的基础上想再初步认识一下操作系统的一些环境编程体系相关知识,当中环境的配置和搭建费了非常大的劲,须要一点点摸索和尝试,下边是环境搭建的 ...

  4. Unix网络编程 -- ubuntu下搭建编译环境( 解决unp.h 编译等问题)

    1.安装编译器,安装build-essential sudo apt-get install build-essential 2.下载本书的头文件 下载unpv13e  http://ishare.i ...

  5. UNIX基础知识--<<UNIX 环境编程>>读书笔记

    1 shell程序就是位于应用软件与系统调用之间的程序   每个用户登录系统,系统就会为用户分配shell (用户的登录的口令文件 在  /etc/passwd 2 ls filename  运行原理 ...

  6. Unix NetWork Programming(unix环境编程)——环境搭建(解决unp.h等源码编译问题)

    此配置实例亲测成功,共勉,有问题大家留言. 环境:VMware 10 + unbuntu 14.04 为了unix进行网络编程,编程第一个unix程序时遇到的问题,不能包含unp.h文件,这个感觉和a ...

  7. 【Unix环境编程】select、poll、epoll机制的联系与区别

    在linux设计并发网络程序,主要有如下几种模型:Apache模型(Process Per Connection, PPC).TPC(Thread Per Connection)模型,select机制 ...

  8. UNIX环境编程学习笔记(20)——进程管理之exec 函数族

    lienhua342014-10-07 在文档“进程控制三部曲”中,我们提到 fork 函数创建子进程之后,通常都会调用 exec 函数来执行一个新程序.调用 exec 函数之后,该进程就将执行的程序 ...

  9. 1.unix网络编程基础知识

    接触网络编程一年多了,最近在系统的学习vnp两本书,对基础知识做一些总结,希望理解的更透彻清晰,希望能有更多的沉淀. 1.套接口地址 针对IPv4和IPv6地址族,分别定义了两种类型的套接口地址:so ...

随机推荐

  1. python实现多变量线性回归(Linear Regression with Multiple Variables)

    本文介绍如何使用python实现多变量线性回归,文章参考NG的视频和黄海广博士的笔记 现在对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为( x1,x2,..., ...

  2. react-router3.x hashHistory render两次的bug,及解决方案

    先写一个简单App页面,其实就是简单修改了react-router的官方例子中的animations例子,修改了两个地方: 1.路由方式由browserHistory修改为hashHistory 2. ...

  3. asyncio

    一.简介 asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLoop的引用, ...

  4. find查找命令

    find # 格式 find [路径] [参数] [表达式] -exec 指令 {} \ ; -{} 代表find找到的文件 -\ 禁止转意 : 表示本行指令结束 # find /sbin -type ...

  5. Express4.x动态的销毁或者替换中间件(app.unuse)

    需求描述 expres4.x托管静态资源时以中间件的方式将server-static挂载到app上,正常的使用没有问题,但是有时候我们需要动态的托管一些静态资源,也就是静态资源的目录不确定的时候该怎么 ...

  6. Eclipse多个console的使用

    我们在使用Eclipse开发服务器端和客户端时,经常需要同时运行服务器端和客户端,以便联调运行情况.而我之前一般有两种做法: 使用Java的命令行模式运行,但这种做法通常比较麻烦,因为要使用大串的cl ...

  7. Maven的声明周期(Lifecycle )和命令(Phase)

    生命周期(Lifecycle ) Maven有三套相互独立的生命周期(Lifecycle ): Clean Lifecycle:做一些清理工作: Default Lifecycle:构建的核心部分.编 ...

  8. TypeScript设计模式之门面、适配器

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 学模式最重要的不是记UML,而是知道什么模式可以解决什么样的问题,在做项目时碰到问题可以想到用哪个模式可以解决,UML忘了可以查,思想 ...

  9. 【RecyclerView与Glide】实现一个Android电子书阅读APP

    http://www.cnblogs.com/xfangs/ 欢迎在本文下方评论,小方很需要鼓励支持!!! 本系列教程仅供学习交流 小说阅读器最终实现效果见 第一篇博文 前言 在上一篇文章中,我们实现 ...

  10. Spark性能调优之代码方面的优化

    Spark性能调优之代码方面的优化 1.避免创建重复的RDD     对性能没有问题,但会造成代码混乱   2.尽可能复用同一个RDD,减少产生RDD的个数   3.对多次使用的RDD进行持久化(ca ...