1.宏所在头文件unistd.h
2. 宏原形
# define TEMP_FAILURE_RETRY(expression) \
(__extension__ \
({ long int __result; \
do __result = (long int) (expression); \
while (__result == -1L && errno == EINTR); \
__result; }))
#endif
3.功能,如果返回指定错误,那么进行重试
如果表达式返回错误是EINTR,那么就进行重试
#define EINTR 4 /* Interrupted system call */
- 错误4代表什么情景可以发生呢?
如果一个进程在一个慢系统调用中阻塞时,当进程捕获到某个信号且相应从信号
处理函数返回时,这个系统调用被中断,然后返回错误,并且设置errno为EINTR
- 什么是为慢系统调用呢?
(1) 读写一个设备时,当缓存满时,需要阻塞等待资源,或者其他原因需要阻塞.
(2) 访问一些互斥资源时,当前条件不满足时
(3) waitpid, accept(阻塞),ioctl等等,只要引起阻塞的系统调用,那么就可以称为慢系统调用.
4.而上面的这个表达式就是为了解决EINTR返回而设计的,但也有其局限性,有些调用不能
简单的重新调用来避免这个问题.
比如connect函数返回一个EINTR错误的时候,不能再次调用它,否则会马上返回一个错误,错对这
种的解决方法是用select(connect_fd)来做.
5.防止EINTR还有一种方法,那就是直接屏蔽此信号,不让系统产生信号中断.
(嵌入式秕系统中,目前在uClibc中这个宏是有定义的,但在musl库中是没有这样的定义,这个在编程的时候,需要注意用的什么库)