Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 生成读取错误_Unix_Testing - Fatal编程技术网

Unix 生成读取错误

Unix 生成读取错误,unix,testing,Unix,Testing,通过写入/dev/full在测试套件中生成写入错误很简单。是否有一种好的技术来产生读取错误?我目前正在使用LD_PRELOAD覆盖read,但这似乎太复杂和不可移植(不是说/dev/full是可移植的…。根据(OS X)read(2)手册页,如果“[a]n尝试读取目录”,read(2)将生成错误。因此,您可以打开(2)一个目录(确保prot不允许写入,否则会引发错误),然后尝试从中读取。这似乎是在“正常”情况下(即不执行诸如故意破坏文件*struct之类的操作)可能发生的唯一错误 我想你说的是C

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

根据(OS X)read(2)手册页,如果“[a]n尝试读取目录”,read(2)将生成错误。因此,您可以打开(2)一个目录(确保prot不允许写入,否则会引发错误),然后尝试从中读取。这似乎是在“正常”情况下(即不执行诸如故意破坏文件*struct之类的操作)可能发生的唯一错误


我想你说的是C或类似语言中的读取(2)错误,但即使在更高级的语言中,你也可以打开一个目录并尝试从中读取(尽管我只是用Python尝试了一下,它太聪明了,不能让你打开目录…)

您还可以传递非法指针作为缓冲区进行读取,这将返回-EFAULT。 比如:

read(fd, (char *)0, cout);
谢谢
铃木

除了从目录中读取(如前一个答案中所述),您还可以尝试读取
/proc/self/mem
以获取错误(这将在Linux上为您提供
EIO
)。有关解释,请参阅:

在所有主要Unice上都可以使用的方法是实现一个小型文件系统。当您的用户空间文件系统驱动程序出错时,EIO是默认的错误代码,因此很容易实现。和绑定都附带示例,您可以快速编写一个主要是镜像现有文件,但在精心选择的位置注入EIO


存在这样一个文件系统:(),我不知道它的开箱操作有多好。

只是一个想法,但是如果从一个perms设置为000的文件中读取呢?@Loadmaster,这将导致一个
打开
错误,而不是
读取
错误。@jpe我不太关心错误是什么;我想成功地打开文件,但得到一个读取错误。我不想简单地输入oke使用无效指针调用read的函数,但希望在触发读取错误的条件下完整运行程序。使用无效指针的简单单元测试不会在实际条件下测试程序。继续问同样的问题。这不会生成读取错误(EINVAL),但在读取过程中,缓冲区在您的可访问地址空间(EFAULT)之外。但根据man 2 read的说法,应该可以通过轻微修改来访问EINVAL。但问题的关键似乎是“如何在不修改代码的情况下访问EINVAL,但生成一个能够模拟所有有趣故障情况的包装器”。实际上,不应修改代码,进程必须成功打开文件,执行多个I/O操作(读取和写入)但是随后的一些读取操作应该失败。这可以通过重写读取并实现一个简单的计数器来实现,这样第n个读取操作就会失败,但最好使用类似于以下内容的shell脚本执行操作:
kill-STOP$pid;chmod 000 file;kill-CONT$pid
。在simil中获取写入错误的方法ar条件会很好,因为在第一次写入时写入/dev/full失败。这是一个很好的技巧,但要注意,
/proc/self/mem
只有在从文件开头读取时才有效。如果程序首先查找,它可能会意外地在映射区域中结束。