您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

如何处理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宏,尽管当我想要它们时,我永远也找不到它的文档。包括现在。

其他 2022/1/1 18:17:53 有375人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶