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