慢系统调用
概念:
慢系统调用指的是可能永远阻塞的系统调用。
例如,pause或wait或accept或读管道时,可能永远阻塞。
EINTR错误
EINTR错误产生的原因:在慢系统调用阻塞的时候,若有个信号发送过来(因为信号是异步的,可能随时过来),并且这个信号没被忽略,那么就会中断这个系统调用,并且把errno置为EINTR。然后就会执行后面的代码。
解决方法
1.重新执行这个慢系统调用(如下图以wait为例),但是有的系统调用不能重新去执行,比如connect
//让父进程等待所有子进程
while(1)
{
int a = wait();
if(a == -1)
{
//如果errno == EINTR,说明是信号中断了
if(errno == EINTR)
continue;
//没有子进程就退出
break;
}
}
2.安装信号时设置SA_RESTART属性
设置这个属性,不会让系统调用返回失败,而是让被该信号中断的系统调用将自动恢复,但是有的有问题,详见man
3.忽略信号
signal(SIGINT,SIG_IGN);