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.c。 63*9a3d2d98SWang Longjie 64*9a3d2d98SWang Longjie注意 65*9a3d2d98SWang Longjie---- 66*9a3d2d98SWang Longjie从 Linux 2.6.13 开始,dnotify 已被 inotify 取代。有关 inotify 的更多信息,请参见 67*9a3d2d98SWang LongjieDocumentation/filesystems/inotify.rst。 68