慢系统调用函数如何处理中断信号EINTR

      我们用慢系统调用来描述那些可能永远堵塞的系统调用(函数调用),如:accept,read等。永远堵塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类。例如,如果没有客户连接到服务器上,则服务器对accept的调用就没有返回保证。类似的,如果客户从未发送过一行要求服务器回射的文本,则服务器对read的调用将永不返回。其他慢系统调用的例子是对管道和终端设备的读写。有一个例外,就是磁盘IO,他一般都返回调用者。


      当一个进程堵塞与慢系统调用时捕获到一个信号,等到信号处理程序返回时,系统调用可能返回一个EINTR错误。有些内核自动重启某些被中断的系统调用。为了便于移植,当我们编写一个捕获信号的程序时(多数并发服务器捕获SIGCHLD),我们必须对慢系统调用返回EINTR有所准备。
为了处理一个被中断的accept,我们对accept的调用尽心了处理,其他慢系统调用函数也可以照此思路进行处理:
for( ; ; )
{
 clien=sizeof(cliaddr);
 if((connfd=accept(listenfd,(SA*)&cliaddr,&clien))<0)
{
 if(errno==EINTR)
  continue;
 else
  err_sys("accept error");
}
}
在这段代码中,我们所做的就是自己重启被中断的系统调用,这对于accept以及其他诸如read,write,select和open这样的函数是合适的,但有一个函数我们不能自己重启:connect。如果这个函数返回INTER,我们就不能再调用他,否则返回错误。当connet被一个捕获的信号中断而且不自动重启时,我们必须调用select来等待连接完成。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值