【发布时间】:2010-07-30 15:26:12
【问题描述】:
在我在 Linux 上进行 C 编程冒险期间的某个时刻,我遇到了一些标志(可能是 ioctl/fcntl?),它使文件描述符上的读写操作不会中断。
不幸的是,我不记得如何做到这一点,或者我在哪里读到它。有人能解释一下吗?
更新0
为了优化我的查询,我采用了相同的阻塞并保证 fwrite() 和 fread() 提供,没有用户空间缓冲。
【问题讨论】:
在我在 Linux 上进行 C 编程冒险期间的某个时刻,我遇到了一些标志(可能是 ioctl/fcntl?),它使文件描述符上的读写操作不会中断。
不幸的是,我不记得如何做到这一点,或者我在哪里读到它。有人能解释一下吗?
为了优化我的查询,我采用了相同的阻塞并保证 fwrite() 和 fread() 提供,没有用户空间缓冲。
【问题讨论】:
您可以通过确保所有信号处理程序都安装有SA_RESTART 标志sigaction() 来避免read() 和write() 中的EINTR。
但是,这并不能保护您免受 短 读取/写入。这只能通过将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;
}
【讨论】:
您是否希望在读/写时禁用中断,或者保证在您的时候没有其他人会读/写文件?
第二种,你可以使用fcntl()的F_GETLK、F_SETLK和F_SETLKW分别获取、释放和测试记录锁。然而,由于 POSIX 锁只是建议性的,Linux 不会强制执行它们——它只在协作进程之间有意义。
第一项任务涉及进入零环并禁用本地处理器上的中断(或全部,如果您在 SMP 系统上)。完成后记得再次启用它们!
【讨论】: