当 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
- #include
- #include
- #include <string.h>
- #include
- int main(int argc,char *argv[])
- {
- int fd;
- char *errmesg;
- // test strerror
- fd = open(argv[1],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 0;
- }
我们先查看 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 时间指的是内核程序所经历的时间,
用户时间 + 系统时间 = 该进程的运行的总时间 <= 时钟时间
获取的方式输入
time -p 程序
real 时钟时间
user 用户 CPU 时间
sys 系统 cpu 时间
由于指令很短是毫秒级或者微秒级的时间 time 显示精度不够,所以显示 0
2017/4/2(坚持 2 天一个博客 连载 unix 的环境编程)
来源: http://www.cnblogs.com/smartxuchao/p/6658060.html