宏: TEMP_FAILURE_RETRY(expression)

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库中是没有这样的定义,这个在编程的时候,需要注意用的什么库)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值