慢系统调用:slow system call,适用于可能被永久阻塞的系统调用,指的是某个调用可能永远无法返回,大多数的网络支持函数属于该类。举例,socket 编程中的accpet 函数。若是没有客户端连接到该服务上,那么accept函数就没有返回的保证。
慢系统调用的基本规则:
当阻塞于某个慢系统调用的进程捕获某个信号且相应的信号处理函数返回时,该慢系统调用可能返回EINTR错误。有的内核会重启这样被中断的系统调用。但是为了程序的健壮性和可移植性(若是内核没有重启呢?比如accept函数,我们的程序将无法正常工作),我们需要处理慢系统调用返回EINTER。for (;;)
{ clilen= sizeof(cliaddr); if ( (connd = accept(listenfd, (SA*)&cliaddr, &clilen)) <0) { if (erron == EINTR) continue;
else
err_sys("accept error");
} }
这样的处理对于 read write select 和 open之类的函数都是可以得,但是对于connect函数,若是捕获了EINTER, 然后重启connect,会立即返回错误。因此,当connect函数被捕获的信号中断时而且不自动重启时,我们必须调用select函数等待连接完成。