来源:www.cncfan.com | 2006-1-11 | (有5460人读过)
慢系统调用(slow system call)是指一些可能永远无法返回的系统调用,多数网络支持函数都在此列,比如accept、read、write、select、open等。
慢系统调用会涉及到一个内核自动重启该调用的问题。因为系统调用在阻塞时很可能被信号处理函数中断,此时内核使该调用返回一个EINTR错误(被中断的系统调用)。若接下来不处理该错误,该进程就会被中止。
虽然在登记信号处理函数时可以设置SA_RESTART标志让调用被中止后自动重启,但不是所有的UNIX操作系统都支持的。而且差不是所有的慢系统调用都可以自动重启的,比如connect,它必须调用select等待连接完成。
一个典型的重启方案是用for循环来实现的:
for(;;){
clilen = sizeof(cliaddr);
if((connfd = accept(listenfd, (SA*)&cliaddr,&clilen))<0){
if(errno == EINTR)
continue; //重启
else
err_sys("accept error!");
}
|