errno
在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen()。erron存放一个正整数来保存上次出错的错误值。
对线程而言,每个线程都有专用的errno变量,不必考虑同步问题。
strerror converts to English (Note: use strerror_r for thread safety)
perror is simplified strerror/fprintf
慢系统调用
指可能永远阻塞而无法返回的系统调用,通常是一些读写的例子,如pipe,终端设备,网络连接,典型的accept(), read(), write(), open(),select(),epoll()等。适用于慢系统调用的基本规则是:当阻塞于某个慢系统调用的进程捕获到某个信号且相应的信号处理函数返回时,系统调用可能会返回一个EINTR错误,即将errno的值置为该值。虽然有些内核会对该系统调用重启,但从可移植性的角度说,对EINTR处理是必须的。注意对connect()不能如此处理。(UNP 5.9)
一个信号被信号处理函数响应,在处理过程中,该信号被屏蔽。标准的信号实现没有排队的功能,所以信号可能会被丢失,多个连续的信号来不及处理。用waidpid()枚举检查不失为一种好的解决方法,见UNP 5.10