栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何处理EINTR(系统调用中断)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何处理EINTR(系统调用中断)

调用写(或其他阻止操作)的代码必须知道EINTR。如果在阻塞操作期间发生信号,则该操作将(a)返回部分完成,或(b)返回失败,不执行任何操作,并将errno设置为EINTR。

因此,对于在中断后重试的全部或失败写操作,您将执行以下操作:

while(size > 0) {    int written = write(filedes, buf, size);    if (written == -1) {        if (errno == EINTR) continue;        return -1;    }    buf += written;    size -= written;}return 0; // success

或者对于表现得更好的东西,它重试EINTR,写尽可能多的东西,并报告在失败时写了多少(以便调用者可以决定是否以及如何继续部分写操作,该写操作由于信号中断以外的原因而失败了):

int total = 0;while(size > 0) {    int written = write(filedes, buf, size);    if (written == -1) {        if (errno == EINTR) continue;        return (total == 0) ? -1 : total;    }    buf += written;    total += written;    size -= written;}return total; // bytes written

GNU有一个可能不感兴趣的非标准TEMP_FAILURE_RETRY宏,尽管当我想要它们时,我永远也找不到它的文档。包括现在。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/388066.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号