提问人:William Pursell 提问时间:6/27/2012 更新时间:5/30/2013 访问量:2070
生成读取错误
Generate a read error
问:
通过写入 在测试套件中生成写入错误很简单。有没有一个好的技术来生成读取错误?我目前正在使用 LD_PRELOAD 进行覆盖,但这似乎太复杂且不可移植(并不是说 /dev/full 是可移植的....../dev/full
read
答:
根据 (OS X) read(2) 手册页,如果 “[a]n attempt to read a directory” ,read(2) 将生成错误。因此,您可以打开(2)一个目录(确保 prot 不允许写入,否则会抛出错误),然后尝试从中读取。这看起来像是那里列出的唯一错误,它可能发生在“正常”情况下(即没有做一些事情,比如故意破坏 FILE* 结构)。
我假设你说的是 C 或类似的东西中的 read(2) 错误,但即使在更高级的语言中,你也可以打开一个目录并尝试从中读取(尽管我只是用 Python 尝试过,它太聪明了,不能让你打开目录......
您也可以将非法指针作为缓冲区传递给读取,这将返回 -EFAULT。 像这样:
read(fd, (char *)0, cout);
谢谢 铃木
评论
kill -STOP $pid; chmod 000 file; kill -CONT $pid
除了从目录读取(如前面的答案中提到的)之外,您还可以尝试读取以获得错误(这应该会在 Linux 上获得错误)。有关说明,请参阅:https://unix.stackexchange.com/a/6302/proc/self/mem
EIO
评论
/proc/self/mem
适用于所有主要 unice 的方法是实现一个小型 FUSE 文件系统。EIO 是用户空间文件系统驱动程序做错事时的默认错误代码,因此很容易实现。Perl 和 Python 绑定都附带了示例,您可以快速编写一个文件系统,该文件系统主要镜像现有文件,但在精心选择的位置注入 EIO。
评论
open
read