【发布时间】:2018-04-09 05:30:04
【问题描述】:
我有一个 C 代码,它使用对文件描述符的阻塞 I/O 调用,其中一些是磁盘 FD,所以我无法使用 select(),但有一些 I/O 调用 (read() / write() ) 被阻止了几秒钟。
如果系统调用阻塞超过指定的时间阈值,比如 500miliSec,是否可以中止系统调用并出错?
我不愿意使用非阻塞 I/O 调用,因为我正在记录 I/O 失败计数并在计数超过限制时终止进程,并且非阻塞 I/O 会迅速处理 I/O 错误计数超出阈值。
【问题讨论】:
-
从磁盘块读取几秒钟?怎么会?这是由于数据量还是由于竞争访问?详细说明这可能有助于解决您的问题。
-
我读对了吗,您对磁盘进行了一些读/写调用,并且它们占用了 500 毫秒以上的时间?因为这听起来像是与设置超时不同的问题......
-
您仍然可以使用非阻塞 I/O。返回值应该类似于
EAGAIN,因此您可以确保检查它并且在这种情况下不要增加错误计数器。 -
@Mikhail 这个问题与线程无关。
-
在大多数 Unixy 系统上向大多数文件系统写入文件系统/磁盘是不可中断的。没有办法获得超时。信号不会中断
read/write,非阻塞 I/O 不会做任何事情(如果你设法在 fd 上设置非阻塞,事情仍然会阻塞)。你运气不好。要么修复你的系统(因为等待磁盘 I/O 几秒钟听起来很糟糕),要么将写入磁盘的内容转移到某个单独的线程/进程并以这种方式管理超时。 (我在上面使用“大多数”,因为有例外,比如软 NFS 挂载或用户空间文件系统等)。
标签: c linux unix system-calls