不间断的读/写调用

时间:2010-07-30 15:26:13

标签: linux ioctl fcntl

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

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

Update0

为了优化我的查询,我正在执行相同的阻止并保证fwrite()fread()提供,没有用户空间缓冲。

2 个答案:

答案 0 :(得分:1)

您可以通过EINTR标记为read()安装所有信号处理程序来避免write()SA_RESTART sigaction()

但是,这并不能保护您免受读/写。这只能通过将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;
}

答案 1 :(得分:0)

您是希望在读/写时禁用中断,还是保证在您使用时没有其他人会读取/写入文件?

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

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