在Linux上进行C编程冒险的某个时刻,我遇到了一些标志(可能是ioctl
/ fcntl
?),它使文件描述符的读写不可中断。
不幸的是我不记得如何做到这一点,或者我在哪里阅读它。任何人都能解释一下吗?
为了优化我的查询,我正在执行相同的阻止并保证fwrite()
和fread()
提供,没有用户空间缓冲。
答案 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系统)。记得在完成后再次启用它们!