_sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/filesystems/inotifymodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/zh_TW/filesystems/inotifymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/it_IT/filesystems/inotifymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ja_JP/filesystems/inotifymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ko_KR/filesystems/inotifymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/sp_SP/filesystems/inotifymodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhT/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/filesystems/inotify.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h&Documentation/filesystems/inotify.rst h]h)}(h%Documentation/filesystems/inotify.rsth]h%Documentation/filesystems/inotify.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h2王龙杰 Wang Longjie h]h)}(h1王龙杰 Wang Longjie h](h王龙杰 Wang Longjie <}(hj hhhNhNubh reference)}(hwang.longjie1@zte.com.cnh]hwang.longjie1@zte.com.cn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:wang.longjie1@zte.com.cnuh1j(hj ubh>}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h:Inotify - 一个强大且简单的文件变更通知系统h]h:Inotify - 一个强大且简单的文件变更通知系统}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjXhhhhhK ubh)}(hL文档由 Robert Love 于 2005 年 3 月 15 日开始撰写h](h文档由 Robert Love <}(hjkhhhNhNubj))}(hrml@novell.comh]hrml@novell.com}(hjshhhNhNubah}(h]h ]h"]h$]h&]refurimailto:rml@novell.comuh1j(hjkubh'> 于 2005 年 3 月 15 日开始撰写}(hjkhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjXhhubh)}(hP文档由 Zhang Zhen 于 2015 年 1 月 4 日更新h](h文档由 Zhang Zhen <}(hjhhhNhNubj))}(hzhenzhang.zhang@huawei.comh]hzhenzhang.zhang@huawei.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refuri!mailto:zhenzhang.zhang@huawei.comuh1j(hjubh > 于 2015 年 1 月 4 日更新}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjXhhubh block_quote)}(hH- 删除了已废弃的接口,关于用户接口请参考手册页。 h]h bullet_list)}(hhh]h list_item)}(hF删除了已废弃的接口,关于用户接口请参考手册页。 h]h)}(hE删除了已废弃的接口,关于用户接口请参考手册页。h]hE删除了已废弃的接口,关于用户接口请参考手册页。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]bullet-uh1jhhhKhjubah}(h]h ]h"]h$]h&]uh1jhhhKhjXhhubhenumerated_list)}(hhh]j)}(h 基本原理 h]h)}(h 基本原理h]h 基本原理}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubah}(h]h ]h"]h$]h&]enumtype lowerromanprefix(suffix)uh1jhjXhhhhhKubhdefinition_list)}(hhh](hdefinition_list_item)}(hv问: 不将监控项与被监控对象打开的文件描述符(fd)绑定,这背后的设计决策是什么? h](hterm)}(h问:h]h问:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjubh definition)}(hhh]h)}(hn不将监控项与被监控对象打开的文件描述符(fd)绑定,这背后的设计决策是什么?h]hn不将监控项与被监控对象打开的文件描述符(fd)绑定,这背后的设计决策是什么?}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj(ubah}(h]h ]h"]h$]h&]uh1j&hjubeh}(h]h ]h"]h$]h&]uh1jhhhKhj ubj)}(hXq答: 监控项会与打开的 inotify 设备相关联,而非与打开的文件相关联。这解决了 dnotify 的主要问题: 保持文件打开会锁定文件,更糟的是,还会锁定挂载点。因此,dnotify 在带有可移动介质的桌面系统 上难以使用,因为介质将无法被卸载。监控文件不应要求文件处于打开状态。 h](j)}(h答:h]h答:}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKhjEubj')}(hhh]h)}(hXi监控项会与打开的 inotify 设备相关联,而非与打开的文件相关联。这解决了 dnotify 的主要问题: 保持文件打开会锁定文件,更糟的是,还会锁定挂载点。因此,dnotify 在带有可移动介质的桌面系统 上难以使用,因为介质将无法被卸载。监控文件不应要求文件处于打开状态。h]hXi监控项会与打开的 inotify 设备相关联,而非与打开的文件相关联。这解决了 dnotify 的主要问题: 保持文件打开会锁定文件,更糟的是,还会锁定挂载点。因此,dnotify 在带有可移动介质的桌面系统 上难以使用,因为介质将无法被卸载。监控文件不应要求文件处于打开状态。}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjWubah}(h]h ]h"]h$]h&]uh1j&hjEubeh}(h]h ]h"]h$]h&]uh1jhhhKhj hhubj)}(h问: 与每个监控项一个文件描述符的方式相比,采用每个实例一个文件描述符的设计决策是出于什么 考虑? h](j)}(h问:h]h问:}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK#hjtubj')}(hhh]h)}(h与每个监控项一个文件描述符的方式相比,采用每个实例一个文件描述符的设计决策是出于什么 考虑?h]h与每个监控项一个文件描述符的方式相比,采用每个实例一个文件描述符的设计决策是出于什么 考虑?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK"hjubah}(h]h ]h"]h$]h&]uh1j&hjtubeh}(h]h ]h"]h$]h&]uh1jhhhK#hj hhubj)}(hX 答: 每个监控项一个文件描述符会很快的消耗掉超出允许数量的文件描述符,其数量会超出实际可管理的范 围,也会超出 select() 能高效处理的范围。诚然,root 用户可以提高每个进程的文件描述符限制, 用户也可以使用 epoll,但同时要求这两者是不合理且多余的。一个监控项所消耗的内存比一个打开的文 件要少,因此将这两个数量空间分开是合理的。当前的设计正是用户空间开发者所期望的:用户只需初始 化一次 inotify,然后添加 n 个监控项,而这只需要一个文件描述符,无需调整文件描述符限制。初 始化 inotify 实例初始化两千次是很荒谬的。如果我们能够简洁地实现用户空间的偏好——而且我们 确实可以,idr 层让这类事情变得轻而易举——那么我们就应该这么做。 还有其他合理的理由。如果只有一个文件描述符,那就只需要在该描述符上阻塞,它对应着一个事件队列。 这个单一文件描述符会返回所有的监控事件以及任何可能的带外数据。而如果每个文件描述符都是一个独 立的监控项, - 将无法知晓事件的顺序。文件 foo 和文件 bar 上的事件会触发两个文件描述符上的 poll(), 但无法判断哪个事件先发生。而用单个队列就可以很容易的提供事件的顺序。这种顺序对现有的应用程 序(如 Beagle)至关重要。想象一下,如果“mv a b ; mv b a”这样的事件没有顺序会是什么 情况。 - 我们将不得不维护 n 个文件描述符和 n 个带有状态的内部队列,而不是仅仅一个。这在 kernel 中 会混乱得多。单个线性队列是合理的数据结构。 - 用户空间开发者更青睐当前的 API。例如,Beagle 的开发者们就很喜欢它。相信我,我问过他们。 这并不奇怪:谁会想通过 select 来管理以及阻塞在 1000 个文件描述符上呢? - 无法获取带外数据。 - 1024 这个数量仍然太少。 ;-) 当要设计一个可扩展到数千个目录的文件变更通知系统时,处理数千个文件描述符似乎并不是合适的接口。 这太繁琐了。 此外,创建多个实例、处理多个队列以及相应的多个文件描述符是可行的。不必是每个进程对应一个文件描 述符;而是每个队列对应一个文件描述符,一个进程完全可能需要多个队列。 h](j)}(h答:h]h答:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKEhjubj')}(hhh](h)}(hX{每个监控项一个文件描述符会很快的消耗掉超出允许数量的文件描述符,其数量会超出实际可管理的范 围,也会超出 select() 能高效处理的范围。诚然,root 用户可以提高每个进程的文件描述符限制, 用户也可以使用 epoll,但同时要求这两者是不合理且多余的。一个监控项所消耗的内存比一个打开的文 件要少,因此将这两个数量空间分开是合理的。当前的设计正是用户空间开发者所期望的:用户只需初始 化一次 inotify,然后添加 n 个监控项,而这只需要一个文件描述符,无需调整文件描述符限制。初 始化 inotify 实例初始化两千次是很荒谬的。如果我们能够简洁地实现用户空间的偏好——而且我们 确实可以,idr 层让这类事情变得轻而易举——那么我们就应该这么做。h]hX{每个监控项一个文件描述符会很快的消耗掉超出允许数量的文件描述符,其数量会超出实际可管理的范 围,也会超出 select() 能高效处理的范围。诚然,root 用户可以提高每个进程的文件描述符限制, 用户也可以使用 epoll,但同时要求这两者是不合理且多余的。一个监控项所消耗的内存比一个打开的文 件要少,因此将这两个数量空间分开是合理的。当前的设计正是用户空间开发者所期望的:用户只需初始 化一次 inotify,然后添加 n 个监控项,而这只需要一个文件描述符,无需调整文件描述符限制。初 始化 inotify 实例初始化两千次是很荒谬的。如果我们能够简洁地实现用户空间的偏好——而且我们 确实可以,idr 层让这类事情变得轻而易举——那么我们就应该这么做。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjubh)}(hX+还有其他合理的理由。如果只有一个文件描述符,那就只需要在该描述符上阻塞,它对应着一个事件队列。 这个单一文件描述符会返回所有的监控事件以及任何可能的带外数据。而如果每个文件描述符都是一个独 立的监控项,h]hX+还有其他合理的理由。如果只有一个文件描述符,那就只需要在该描述符上阻塞,它对应着一个事件队列。 这个单一文件描述符会返回所有的监控事件以及任何可能的带外数据。而如果每个文件描述符都是一个独 立的监控项,}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjubj)}(hhh](j)}(hX{将无法知晓事件的顺序。文件 foo 和文件 bar 上的事件会触发两个文件描述符上的 poll(), 但无法判断哪个事件先发生。而用单个队列就可以很容易的提供事件的顺序。这种顺序对现有的应用程 序(如 Beagle)至关重要。想象一下,如果“mv a b ; mv b a”这样的事件没有顺序会是什么 情况。 h]h)}(hXz将无法知晓事件的顺序。文件 foo 和文件 bar 上的事件会触发两个文件描述符上的 poll(), 但无法判断哪个事件先发生。而用单个队列就可以很容易的提供事件的顺序。这种顺序对现有的应用程 序(如 Beagle)至关重要。想象一下,如果“mv a b ; mv b a”这样的事件没有顺序会是什么 情况。h]hXz将无法知晓事件的顺序。文件 foo 和文件 bar 上的事件会触发两个文件描述符上的 poll(), 但无法判断哪个事件先发生。而用单个队列就可以很容易的提供事件的顺序。这种顺序对现有的应用程 序(如 Beagle)至关重要。想象一下,如果“mv a b ; mv b a”这样的事件没有顺序会是什么 情况。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h我们将不得不维护 n 个文件描述符和 n 个带有状态的内部队列,而不是仅仅一个。这在 kernel 中 会混乱得多。单个线性队列是合理的数据结构。 h]h)}(h我们将不得不维护 n 个文件描述符和 n 个带有状态的内部队列,而不是仅仅一个。这在 kernel 中 会混乱得多。单个线性队列是合理的数据结构。h]h我们将不得不维护 n 个文件描述符和 n 个带有状态的内部队列,而不是仅仅一个。这在 kernel 中 会混乱得多。单个线性队列是合理的数据结构。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h用户空间开发者更青睐当前的 API。例如,Beagle 的开发者们就很喜欢它。相信我,我问过他们。 这并不奇怪:谁会想通过 select 来管理以及阻塞在 1000 个文件描述符上呢? h]h)}(h用户空间开发者更青睐当前的 API。例如,Beagle 的开发者们就很喜欢它。相信我,我问过他们。 这并不奇怪:谁会想通过 select 来管理以及阻塞在 1000 个文件描述符上呢?h]h用户空间开发者更青睐当前的 API。例如,Beagle 的开发者们就很喜欢它。相信我,我问过他们。 这并不奇怪:谁会想通过 select 来管理以及阻塞在 1000 个文件描述符上呢?}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h无法获取带外数据。 h]h)}(h无法获取带外数据。h]h无法获取带外数据。}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK=hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h&1024 这个数量仍然太少。 ;-) h]h)}(h%1024 这个数量仍然太少。 ;-)h]h%1024 这个数量仍然太少。 ;-)}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK?hj7ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhhhK2hjubh)}(h当要设计一个可扩展到数千个目录的文件变更通知系统时,处理数千个文件描述符似乎并不是合适的接口。 这太繁琐了。h]h当要设计一个可扩展到数千个目录的文件变更通知系统时,处理数千个文件描述符似乎并不是合适的接口。 这太繁琐了。}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKAhjubh)}(h此外,创建多个实例、处理多个队列以及相应的多个文件描述符是可行的。不必是每个进程对应一个文件描 述符;而是每个队列对应一个文件描述符,一个进程完全可能需要多个队列。h]h此外,创建多个实例、处理多个队列以及相应的多个文件描述符是可行的。不必是每个进程对应一个文件描 述符;而是每个队列对应一个文件描述符,一个进程完全可能需要多个队列。}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKDhjubeh}(h]h ]h"]h$]h&]uh1j&hjubeh}(h]h ]h"]h$]h&]uh1jhhhKEhj hhubj)}(h/问: 为什么采用系统调用的方式? h](j)}(h问:h]h问:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKHhj}ubj')}(hhh]h)}(h'为什么采用系统调用的方式?h]h'为什么采用系统调用的方式?}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKHhjubah}(h]h ]h"]h$]h&]uh1j&hj}ubeh}(h]h ]h"]h$]h&]uh1jhhhKHhj hhubj)}(hX答: 糟糕的用户空间接口是 dnotify 的第二大问题。信号对于文件通知来说是一种非常糟糕的接口。其实对 于其他任何事情,信号也都不是好的接口。从各个角度来看,理想的解决方案是基于文件描述符的,它允许 基本的文件 I/O 操作以及 poll/select 操作。获取文件描述符和管理监控项既可以通过设备文件来 实现,也可以通过一系列新的系统调用来实现。我们决定采用一系列系统调用,因为这是提供新的内核接口 的首选方法。两者之间唯一真正的区别在于,我们是想使用 open(2) 和 ioctl(2),还是想使用几 个新的系统调用。系统调用比 ioctl 更有优势。h](j)}(h答:h]h答:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKOhjubj')}(hhh]h)}(hX糟糕的用户空间接口是 dnotify 的第二大问题。信号对于文件通知来说是一种非常糟糕的接口。其实对 于其他任何事情,信号也都不是好的接口。从各个角度来看,理想的解决方案是基于文件描述符的,它允许 基本的文件 I/O 操作以及 poll/select 操作。获取文件描述符和管理监控项既可以通过设备文件来 实现,也可以通过一系列新的系统调用来实现。我们决定采用一系列系统调用,因为这是提供新的内核接口 的首选方法。两者之间唯一真正的区别在于,我们是想使用 open(2) 和 ioctl(2),还是想使用几 个新的系统调用。系统调用比 ioctl 更有优势。h]hX糟糕的用户空间接口是 dnotify 的第二大问题。信号对于文件通知来说是一种非常糟糕的接口。其实对 于其他任何事情,信号也都不是好的接口。从各个角度来看,理想的解决方案是基于文件描述符的,它允许 基本的文件 I/O 操作以及 poll/select 操作。获取文件描述符和管理监控项既可以通过设备文件来 实现,也可以通过一系列新的系统调用来实现。我们决定采用一系列系统调用,因为这是提供新的内核接口 的首选方法。两者之间唯一真正的区别在于,我们是想使用 open(2) 和 ioctl(2),还是想使用几 个新的系统调用。系统调用比 ioctl 更有优势。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKKhjubah}(h]h ]h"]h$]h&]uh1j&hjubeh}(h]h ]h"]h$]h&]uh1jhhhKOhj hhubeh}(h]h ]h"]h$]h&]uh1j hjXhhhhhNubeh}(h]inotifyah ]h"]:inotify - 一个强大且简单的文件变更通知系统ah$]h&]uh1jVhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j[N generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}jjs nametypes}jsh}jjXs footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log]8Documentation/translations/zh_CN/filesystems/inotify.rst(NNNNta decorationNhhub.