gpt4 book ai didi

python - 在 Linux 上伪造 IO 错误

转载 作者:IT王子 更新时间:2023-10-29 00:26:39 24 4
gpt4 key购买 nike

我在 Linux 上有一个 Python 和 C 应用程序,它应该在从磁盘读取文件时正确处理 IO 错误。该应用程序的大部分是用 Python 编写的,带有执行 IO 的 C 扩展。正是在这个扩展中检测到 IO 错误。

在我看来,错误出现有两种情况。

  1. 缺少一个文件。
  2. 文件在磁盘上(使用 stat)看起来比使用 fread 读取的要大。

我可以相当轻松地测试和处理案例 1。但是,我也想为案例 2 编写单元测试。但是,我不知道如何为测试触发“假”IO 错误。这可能吗?有没有更好的方法来测试这种错误?

最佳答案

errno(3)仅针对

设置为 EIO
   EIO    Input/output error (POSIX.1)

另外,根据 read(2)对于:

   EIO    I/O error.  This will happen for example when the process is
in a background process group, tries to read from its
controlling terminal, and either it is ignoring or blocking
SIGTTIN or its process group is orphaned. It may also occur
when there is a low-level I/O error while reading from a
disk or tape.

并根据write(2)对于:

   EIO    A low-level I/O error occurred while modifying the inode.

因此模拟特定的错误代码可能很困难;请注意还有其他 I/O 系统调用,特别是 writev(2)和(间接)mmap(2) , 但 read(2)write(2) 是最常见的。

另请注意 file systemsLinux kernel (例如它的 VFS 层)是 caching数据。您可能会更晚或永远不会获得 EIO。参见 sync(2)fsync(2)

但是,一般来说,大多数软件不会专门处理 EIO w.r.t.其他错误代码;您可能通过获取另一个错误代码进行了足够的测试,例如

  EDQUOT The user's quota of disk blocks on the filesystem containing
the file referred to by fd has been exhausted.

因此,您可能会通过限制 disk quotas 来进行足够的测试(参见 quotactl(2)setquota(8) 等...)和文件空间(参见 setrlimit(2)RLIMIT_FSIZEprlimit(1)ulimit 内置于 bash(1) 等...)

如果你真的想专门伪造EIO,你可能会物理损坏设备(或者可能只是在错误的时刻拔下 USB 磁盘)或编写你自己的 Filesystem in User Space (FUSE) 模拟它。我认为这不值得付出努力(因为当某些东西得到 EIO 时,整个计算机很快就会变得无法使用,无论如何用户都会注意到......而且因为大多数软件都会处理所有错误代码同样 - 除了 EINTR)

在代码的 C 部分,您可能需要使用 strerror(3) (可能有 syslog(3))和/或 perror(3) .我不确定以与大多数其他错误截然不同的方式处理 EIO 是否值得。

注意:许多关键领域都有定义错误处理方式以及代码开发和测试方式的标准,例如ISO26262在汽车或DO-178B在航空电子设备中。遵循您所在域的标准。

关于python - 在 Linux 上伪造 IO 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21033660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com