xref: /linux/Documentation/translations/zh_CN/filesystems/dnotify.rst (revision f96163865a1346b199cc38e827269296f0f24ab0)
1*9a3d2d98SWang Longjie.. SPDX-License-Identifier: GPL-2.0
2*9a3d2d98SWang Longjie
3*9a3d2d98SWang Longjie.. include:: ../disclaimer-zh_CN.rst
4*9a3d2d98SWang Longjie
5*9a3d2d98SWang Longjie:Original: Documentation/filesystems/dnotify.rst
6*9a3d2d98SWang Longjie
7*9a3d2d98SWang Longjie:翻译:
8*9a3d2d98SWang Longjie
9*9a3d2d98SWang Longjie   王龙杰 Wang Longjie <wang.longjie1@zte.com.cn>
10*9a3d2d98SWang Longjie
11*9a3d2d98SWang Longjie==============
12*9a3d2d98SWang LongjieLinux 目录通知
13*9a3d2d98SWang Longjie==============
14*9a3d2d98SWang Longjie
15*9a3d2d98SWang Longjie	   Stephen Rothwell <sfr@canb.auug.org.au>
16*9a3d2d98SWang Longjie
17*9a3d2d98SWang Longjie目录通知的目的是使用户应用程序能够在目录或目录中的任何文件发生变更时收到通知。基本机制包括应用程序
18*9a3d2d98SWang Longjie通过 fcntl(2) 调用在目录上注册通知,通知本身则通过信号传递。
19*9a3d2d98SWang Longjie
20*9a3d2d98SWang Longjie应用程序可以决定希望收到哪些 “事件” 的通知。当前已定义的事件如下:
21*9a3d2d98SWang Longjie
22*9a3d2d98SWang Longjie	=========	=====================================
23*9a3d2d98SWang Longjie	DN_ACCESS	目录中的文件被访问(read)
24*9a3d2d98SWang Longjie	DN_MODIFY	目录中的文件被修改(write,truncate)
25*9a3d2d98SWang Longjie	DN_CREATE	目录中创建了文件
26*9a3d2d98SWang Longjie	DN_DELETE	目录中的文件被取消链接
27*9a3d2d98SWang Longjie	DN_RENAME	目录中的文件被重命名
28*9a3d2d98SWang Longjie	DN_ATTRIB	目录中的文件属性被更改(chmod,chown)
29*9a3d2d98SWang Longjie	=========	=====================================
30*9a3d2d98SWang Longjie
31*9a3d2d98SWang Longjie通常,应用程序必须在每次通知后重新注册,但如果将 DN_MULTISHOT 与事件掩码进行或运算,则注册
32*9a3d2d98SWang Longjie将一直保持有效,直到被显式移除(通过注册为不接收任何事件)。
33*9a3d2d98SWang Longjie
34*9a3d2d98SWang Longjie默认情况下,SIGIO 信号将被传递给进程,且不附带其他有用的信息。但是,如果使用 F_SETSIG fcntl(2)
35*9a3d2d98SWang Longjie调用让内核知道要传递哪个信号,一个 siginfo 结构体将被传递给信号处理程序,该结构体的 si_fd 成员将
36*9a3d2d98SWang Longjie包含与发生事件的目录相关联的文件描述符。
37*9a3d2d98SWang Longjie
38*9a3d2d98SWang Longjie应用程序最好选择一个实时信号(SIGRTMIN + <n>),以便通知可以被排队。如果指定了 DN_MULTISHOT,
39*9a3d2d98SWang Longjie这一点尤为重要。注意,SIGRTMIN 通常是被阻塞的,因此最好使用(至少)SIGRTMIN + 1。
40*9a3d2d98SWang Longjie
41*9a3d2d98SWang Longjie实现预期(特性与缺陷 :-))
42*9a3d2d98SWang Longjie--------------------------
43*9a3d2d98SWang Longjie
44*9a3d2d98SWang Longjie对于文件的任何本地访问,通知都应能正常工作,即使实际文件系统位于远程服务器上。这意味着,对本地用户
45*9a3d2d98SWang Longjie模式服务器提供的文件的远程访问应能触发通知。同样的,对本地内核 NFS 服务器提供的文件的远程访问
46*9a3d2d98SWang Longjie也应能触发通知。
47*9a3d2d98SWang Longjie
48*9a3d2d98SWang Longjie为了尽可能减小对文件系统代码的影响,文件硬链接的问题已被忽略。因此,如果一个文件(x)存在于两个
49*9a3d2d98SWang Longjie目录(a 和 b)中,通过名称”a/x”对该文件进行的更改应通知给期望接收目录“a”通知的程序,但不会
50*9a3d2d98SWang Longjie通知给期望接收目录“b”通知的程序。
51*9a3d2d98SWang Longjie
52*9a3d2d98SWang Longjie此外,取消链接的文件仍会在它们链接到的最后一个目录中触发通知。
53*9a3d2d98SWang Longjie
54*9a3d2d98SWang Longjie配置
55*9a3d2d98SWang Longjie----
56*9a3d2d98SWang Longjie
57*9a3d2d98SWang LongjieDnotify 由 CONFIG_DNOTIFY 配置选项控制。禁用该选项时,fcntl(fd, F_NOTIFY, ...) 将返
58*9a3d2d98SWang Longjie回 -EINVAL。
59*9a3d2d98SWang Longjie
60*9a3d2d98SWang Longjie示例
61*9a3d2d98SWang Longjie----
62*9a3d2d98SWang Longjie具体示例可参见 tools/testing/selftests/filesystems/dnotify_test.c63*9a3d2d98SWang Longjie
64*9a3d2d98SWang Longjie注意
65*9a3d2d98SWang Longjie----
66*9a3d2d98SWang Longjie从 Linux 2.6.13 开始,dnotify 已被 inotify 取代。有关 inotify 的更多信息,请参见
67*9a3d2d98SWang LongjieDocumentation/filesystems/inotify.rst68