免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1611 | 回复: 0
打印 上一主题 下一主题

系统调用被信号中断和自动重启动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-04 19:59 |只看该作者 |倒序浏览
当进程正在执行一个低速系统调用且处于阻塞期间时,如果进程捕获到一个信号,则该调用被中断,不再继续执行。 该系统调用返回出错,起errono设置为EINTR。 因为发生信号, 进程捕捉到它, 这将是一个很好的机会来唤醒阻塞的系统调用。
    与被中断的系统调用相关的问题是必须显示的处理这种出错返回,判断出错是否是因为被信号中断导致,看系统是否支持自动重启,以及我们是否需要重启被信号中断的系统调用。
    如果系统不自动重启这些被中断的系统调用,而我们希望重启,通常有2种方法,一是通过出错后检查errno,这是比较通用的方法,如下:
               
               
                again:
    if((n=read(fd,buf,BUFFSEZE))0)
    {
        if(errno==EINTR)      //改错误是因为被信号中断
            goto again;
    }
另一种方法是在sigaction中设置允许重新启动被特定信号中断的系统调用的标志SA_RESTART(有些系统可能不支持):act.sa_flags |= SA_RESTART;
    某些系统引入了某些被中断后自动重启动的系统调用,如ioctl,read,readv,write,writev...,但这也会带来一些问题,如果我们并不希望重启这些被中断的调用,这时可以通过sigaction禁止重启,act.sa_flags |= SA_INTERRUPT。
    上述只是针对可能被阻塞的低速的系统调用,如果系统调用执行时没有阻塞,则其不会被信号中断,即使这时发生了信号。如果是设置了非阻塞的系统调用,则不必考虑被信号中断的问题了。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103462/showart_2086450.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP