EINTR错误

EINTR错误的产生:

当系统阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。例如:在socket服务器端,设置了信号捕获机制,有子进程,当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时,内核会致使accept返回一个EINTR错误(被中断的系统调用)。此类慢系统调用包括永远阻塞的系统调用即调用有可能永远无法返回,多数网络支持函数都属于这一类。(accept,select,read)

​EINTR错误的处理方法:

(1)人为重启被中断的系统调用​。人为当碰到EINTR错误的时候,有一些可以重启的系统调用要进行重启,而对于有一些系统调用是不能够重启的。例如:accept、read、write、select、和open之类的函数来说,是可以进行重启的。不过对于套接字编程中的connect函数我们是不能重启的,若connect函数返回一个EINTR错误的时候,我们不能再次调用它,否则将立即返回一个错误。针对connect不能重启的处理方法是,必须调用select来等待连接完成。

(2)​安装信号时设置 SA_RESTART属性

  安装信号的时候, 设置 SA_RESTART属性,那么当信号处理函数返回后, 不会让系统调用返回失败,而是让被该信号中断的系统调用将自动恢复。

  • struct sigaction action;  
  •    
  • action.sa_handler = handler_func;  
  • sigemptyset(&action.sa_mask);  
  • action.sa_flags = 0;  
  •   
  • action.sa_flags |= SA_RESTART;  
  •    
  • sigaction(SIGALRM, &action, NULL); 
  • (3)忽略信号。

当然最简单的方法是忽略信号,在安装信号时,明确告诉系统不会产生该信号的中断。

  1. struct sigaction action;  
  •    
  • action.sa_handler = SIG_IGN;  
  • sigemptyset(&action.sa_mask);  
  •    
  • sigaction(SIGALRM, &action, NULL);

转载于:https://www.cnblogs.com/luiz/p/6828827.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值