分类:
2008-10-18 14:11:45
1.7 Error Handling
Errno不会被清除,除非被一个调用出错重新赋值,所以如果操作没有出错,不要去查看errno,因为它的值应该是以前别的调用产生的。
多线程的影响:多线程由于共享process的地址空间,因此如果只使用一个errno变量,会造成多个线程之间对errno使用的混乱。因此各个thread应该有自己的针对errno的local copy,即一个process内部的各个thread都应该有自己的一份errno,而且各个thread通过一个函数获取各自thread的errno变量的地址,然后读取其值,而不是直接去访问errno变量,因为这样访问到的可能不是本thread的local copy的errno变量哦。这种技术叫做TLS。即thread local storage。
在errno.h中,定义_MT后, errno被定义为 (*_errno()) , _errno定义为int * _errno(void);
但是不知道是具体如何实现线程安全的?
1.9 signals
Process运行的时候可以收到其他process发来的signal,可以忽略,采用默认的处理,或者自定义处理方式。被零除就是一种硬件exception,Ctrl+C也会触发quit signal。
1.10 time values
UNIX系统维护两种不同类型的时间值
calendar time: 从
process time: 也叫CPU时间,用于衡量一个进程使用的处理器资源,以clock tick为单位。通常1s有50,60,或者100个ticks。系统数据类型clock_t用于记录该时间
UNIX系统对进程维护三种不同类型的时间
clock time: 有时候也叫wall clock time,即进程运行时间。该值与系统运行进程数量有关系
User CPU time: 指CPU执行用户指令的时间。即CPU执行用户代码的时间
System CPU time: 指进程占用内核的时间。即CPU执行系统(kernel)代码的时间,包括读取文件,从虚拟内存中读取或者写入信息等等
User CPU time 和System CPU time 加起来叫着CPU time
可以使用time命令来测量一个program的上述时间值:
$ cd /usr/include
$ time -p grep _POSIX_SOURCE */*.h > /dev/null
real
user
sys
1.11 system calls and library functions