- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个使用 inotify 跟踪文件系统更改的 Linux 应用程序。我想为它编写一个功能测试套件,从最终用户的角度测试应用程序,作为其中的一部分,我想测试文件系统失败的情况,特别是我想测试 inotify 失败。
具体来说,我想调用 inotify_init()
、inotify_add_watch()
、inotify_rm_watch()
调用和调用 read()
当测试需要时,inotify 文件描述符会返回错误。
但问题是我找不到如何模拟 inotify 失败的方法。我想知道是否有人已经遇到过这样的问题并且知道一些解决方案。
最佳答案
如果您想避免任何模拟,最好的办法就是通过直接达到操作系统限制来引发错误。例如,inotify_init
可能会因 EMFILE
errno 而失败,如果调用进程已达到打开文件描述符的数量限制。要以 100% 的精度达到这样的条件,您可以使用两个技巧:
inotify 所有可能的错误条件都记录在 inotify
、inotify_init
和 inotify_add_watch
的手册页中(我不认为 inotify_rm_watch
可能会失败,除非代码中存在纯粹的编程错误。
除了普通错误(例如遍历 /proc/sys/fs/inotify/max_user_watches
)之外,inotify 有几种错误模式(队列空间耗尽、watch ID 重用),但这些不是严格意义上的“失败”。
当有人执行文件系统更改的速度快于您的 react 速度时,就会发生队列耗尽。它很容易重现:使用 cgroups 暂停您的程序,同时它有一个 inotify 描述符打开(因此事件队列不会耗尽)并通过修改观察到的文件/目录快速生成 很多 通知。一旦你有 /proc/sys/fs/inotify/max_queued_events
未处理的事件,并取消暂停你的程序,它将收到 IN_Q_OVERFLOW
(并且可能会错过一些事件,这没有'不适合队列)。
Watch ID 重用的重现是乏味的,因为现代内核从类似文件描述符的行为切换到类似 PID 的 watch-ID 行为。您应该使用与测试 PID 重用时相同的方法——创建和销毁 很多 的 inotify watch ,直到整数 watch ID 回绕。
Inotify 还有一些棘手的极端情况,在正常操作期间很少发生(例如,我所知道的所有 Java 绑定(bind),包括 Android 和 OpenJDK,都不能正确处理所有这些情况):相同的 inode 问题和处理IN_UNMOUNT
。
相同 inode 问题在 inotify 文档中有很好的解释:
A successful call to inotify_add_watch() returns a unique watch descriptor for this inotify instance, for the filesystem object (inode) that corresponds to pathname. If the filesystem object was not previously being watched by this inotify instance, then the watch descriptor is newly allocated. If the filesystem object was already being watched (perhaps via a different link to the same object), then the descriptor for the existing watch is returned.
简而言之:如果您观看同一个文件的两个硬链接(hard link),它们的数字观看 ID 将相同。这种行为很容易导致失去对第二个 inotify watch 的跟踪,如果你将 watch 存储在 hashmap 之类的东西中,用整数 watch ID 键控。
第二个问题更难观察到,因此即使不是错误模式也很少得到正确支持:卸载分区,目前通过 inotify 观察到。棘手的部分是:Linux 文件系统不允许您在文件描述符打开它们时自行卸载,但是通过 inotify 观察文件不会阻止文件系统卸载。如果您的应用在单独的文件系统上观察文件,并且用户卸载了该文件系统,则您必须准备好处理由此产生的 IN_UNMOUNT
事件。
以上所有测试都应该可以在 tmpfs 文件系统上执行。
关于linux - 如何在功能测试中模拟 INotify 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49503859/
如何解决以下问题?我正在使用 compass 。 Too many open files - Failed to initialize inotify: the user limit on th
我最终遇到了这样一种情况:一个目录正在被 inotify 监视,以触发一个不存在的进程。 我只是想阻止inotify监视目录,但是经过搜索和reading the man page我找不到如何做到这一
1.1 什么是实时同步:如何实现实时同步 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上 1.2 实现实时
我正在尝试使用 inotify 递归地查看目录,这意味着,每当在此目录或其中一个子目录中创建目录或文件时,我都希望收到通知。程序开始时主目录为空。 我基本上是从这里复制代码进行测试:https://g
我正在编写一个基于源代码的监控文件程序:https://github.com/kvikas/file-monitor-service/blob/master/ 我的程序使用 boost::asio::
我是 Fedora 用户,目前正在使用 inotify-java 来实现目录轮询。我有以下代码片段: InotifyEventListener inel = new InotifyEventListe
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我正在用 C 语言编写一个简单的线程来监视目录内文件的修改。该目录中有多个文件,其中一些文件经常更改。我想监视一些特定文件。 我仔细阅读了Linux手册,但没有找到答案谢谢问候帕特里夏 最佳答案 您无
我的程序使用 inotify用于监视文件的更改。我的代码如下: fd = inotify_init(); wd = inotify_add_watch(fd, "./test.txt"
我正在繁忙的目录上使用inotify(文件不断生成)。我希望捕获所有这些事件的 IN_CLOSE_WRITE 事件。 所以我尝试了这样的事情。 fd = inotify_init(); inotify
我尝试在线程内的 C++ 中使用 inotify但是 select 是阻塞的,所以当我的应用程序退出时我永远不能离开线程 我如何创建 inotify watch fd=inotify_init1(IN
我想监控一个文件夹。 每次弹出通知时,我都想运行系统命令行。使用系统命令时出现问题。每个新事件弹出 3 次,尽管它应该弹出一次。编辑:谢谢你重播。我发现了这个错误。系统执行了一个位于受监控文件夹内的文
我想监控某些目录中新文件的创建并阅读有关 inotify 的链接.我喜欢这个实现并使用了它。然而,在我的例子中,我想监控一个最多有 3 级子目录的目录。 我的想法是每次创建一个新目录时添加一个 wat
删除同一目录下的文件时,事件丢失。 inotify监控目录:./test删除命令:rm -rf ./test/* 文件数:20; 但是事件通知12,这是怎么回事? int fileDescripter
所以我使用 inotifywait 运行了这个脚本。一台服务器将图像放入位于/var/nfs/device_images 的主机服务器上的 NFS 文件夹中。 (工作文件夹上的 chmod 是 777
例如,假设您有一个以下列形式使用 inotifywait 的 shell 脚本 inotifywait -m -e create /home/user1/*/* 本质上,您是在要求它监控 user1
我在 Linux 上使用 inotify 来监视目录。我的目录有 50 个子目录,目录树有 20 层深。到目前为止,我能够监视目录及其所有子目录。我使用 C++ STL vector 来保存每个目录路
我的 Linux 服务器上有 inotify。我在网上查找了大量关于如何使用 inotify 的帖子,并找到了一个示例 C 代码,用于监视文件创建/删除的目录。它在本地目录和 nfs direcory
我正在寻找一个使用 inotify 的简单、简洁的示例gem 来检测目录的更改。 它缺少示例。 最佳答案 examples/watcher.rb 中有一个示例.该链接指向 aredridel 的 re
所以我有一个文件系统,它正在下载一些数据,将其存储在内存中,并仅将已完成的下载作为文件呈现给用户。但是,每次下载可能需要一些时间才能完成,因此我不希望用户必须等待所有文件完成下载。我执行此操作的方法是
我是一名优秀的程序员,十分优秀!