7

在测试套件中通过写入/dev/full. 有没有一种很好的技术来产生读取错误?我目前正在使用 LD_PRELOAD 来覆盖read,但这似乎太复杂且不可移植(不是 /dev/full 是可移植的......)。

4

4 回答 4

6

除了从目录中读取(如上一个答案中所述)之外,您还可以尝试读取/proc/self/mem以获取错误(这应该让您EIO在 Linux 上得到错误)。解释请见:https ://unix.stackexchange.com/a/6302

于 2012-07-06T12:59:14.807 回答
4

一种适用于所有主要单元的方法是实现一个小型FUSE文件系统。EIO 是您的用户空间文件系统驱动程序出错时的默认错误代码,因此很容易实现。PerlPython绑定都带有示例以开始使用,您可以快速编写一个文件系统,该文件系统主要反映现有文件,但在精心选择的位置注入 EIO。

有一个现有的这样的文件系统:petardfs文章),我不知道它开箱即用的效果如何。

于 2013-05-29T21:33:33.107 回答
2

根据 (OS X) read(2) 联机帮助页,如果“[a]n 尝试读取目录”,read(2) 将生成错误。因此,您可以打开(2) 一个目录(确保 prot 不允许写入,否则会引发错误),然后尝试从中读取。这看起来像是在“正常”情况下可能发生的唯一错误(即没有做诸如故意破坏 FILE* 结构之类的事情)。

我假设您在谈论 C 或类似语言中的 read(2) 错误,但即使在高级语言中,您也可以打开一个目录并尝试从中读取(尽管我只是尝试过)用Python,太聪明了,不让你打开目录……)

于 2012-06-27T23:59:54.087 回答
1

您也可以将非法指针作为要读取的缓冲区传递,这将返回-EFAULT。就像是 :

read(fd, (char *)0, cout);

谢谢铃木

于 2012-06-28T02:44:13.777 回答