EINTR的捕获处理

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 被中断之后的处理

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值