EINTR:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。
信号 SA_RESTART 标志的设置:但不方便于移植,大多数Berkeley的实现从不自动重启select,其中有些实现不重启accept、recvfrom
void sig_handler(int signum)
{
printf("in handler\n");
sleep(1);
printf("return handler\n");
}
struct sigaction action, old_action;
action.sa_handler = sig_handler;
sigemptyset(&action.sa_mask);
action.sa_flags = 0;
/* 版本1:不设置SA_RESTART属性
/* 版本2:设置SA_RESTART属性 */
//action.sa_flags |= SA_RESTART;
sigaction(SIGINT, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN)
{
sigaction(SIGINT, &action, NULL);
}
EINTR
1、对于绝大多数慢速系统调用来说比如:accept、read、write、open等多数可能永远阻塞的系统调用
for ( ; ; )
{
clilen = sizeof(cliaddr);
if ( (connfd = accept(listenfd, (SA *)&cliaddr, &clilen)) < 0)
{
if (errno == EINTR)
continue;
else
err_sys("accept error");
}
}
2、connect 被中断之后的处理

6689

被折叠的 条评论
为什么被折叠?



