1

在我在 Linux 上的 C 编程冒险中的某个时刻,我遇到了标志(可能是ioctl/ fcntl?),它使文件描述符上的读取和写入不会中断。

不幸的是,我不记得如何做到这一点,或者我在哪里读到它。任何人都可以解释一下吗?

更新0

为了完善我的查询,我在同样的阻塞和保证之后fwrite()提供fread(),没有用户空间缓冲。

4

2 回答 2

1

您可以避免EINTR并确保所有信号处理程序read()write()安装SA_RESTARTsigaction().

但是,这并不能保护您免受读/写的影响。这只能通过将read()/放入循环中来实现(除了必须提供给/调用write()的缓冲区之外,它不需要额外的缓冲区。)read()write()

这样的循环看起来像:

/* If return value is less than `count', then errno == 0 indicates end of file,
 * otherwise errno indicates the error that occurred. */
ssize_t hard_read(int fd, void *buf, size_t count)
{
    ssize_t rv;
    ssize_t total_read = 0;

    while (total_read < count)
    {
        rv = read(fd, (char *)buf + total_read, count - total_read);

        if (rv == 0)
            errno = 0;

        if (rv < 1)
            if (errno == EINTR)
                continue;
            else
                break;

        total_read += rv;
    }

    return rv;
}
于 2010-07-31T04:38:54.817 回答
0

您是否希望在读/写时禁用中断,或者保证在您工作时没有其他人会读/写文件?

第二种,您可以使用fcntl()F_GETLK、F_SETLK 和 F_SETLKW 分别获取、释放和测试记录锁。然而,由于 POSIX 锁只是建议性的,Linux 不会强制执行它们——它只在协作进程之间有意义。

第一项任务涉及进入零环并禁用本地处理器上的中断(或全部,如果您在 SMP 系统上)。完成后记得再次启用它们!

于 2010-07-30T15:35:28.263 回答