在 OS X 上使用 /dev/autofs_nowait 的风险和回报
Risks and rewards of using /dev/autofs_nowait on OS X
在整个 CoreFoundation framework source, POSIX filesystem API calls (e.g. open()
, stat()
, et al…) are wrapped in an idiom 中,在进行 POSIX 调用之前,使用 open(…, 0)
获取 /dev/autofs_nowait
上的描述符;之后描述符在作用域退出之前是 close()
。
这样做有什么好处?有什么风险?
获取 /dev/autofs_nowait
描述符是否对任何如此包装的 open()
调用(例如 O_NONBLOCK
的标志有任何影响,或者是否受其影响)?
/dev
在我的机器上,运行 OS X 10.10.5 还有其他“autofs”条目:
…none 其中有 man
页可用。如果这些类似文件的设备可以提供这方面的好处,我也很想听听它们的使用情况,因为它可能与此有关。
附录:关于这个主题我找不到太多信息; Google Plus post from 2011 声称:
[t]his file is a special device that's monitored by the autofs
filesystem implementation in the kernel. When opened, the autofs
filesystem will not block that process on any I/O operations on an
autofs file system.
我不太确定那是什么意思(他们专门谈论 launchd
是如何工作的,FWIW)但我自己对此很好奇,所以我写了 a quick context-manager-y RAII struct to try it out – 非目标分析显示测试POSIX 调用完成得更快,但在一般哈希标记内;在了解更多有关其工作原理的背景知识后,我将仔细研究此策略。
这些设备允许实现者避免为功能定义新的 syscall
或 ioctl
,并且可能以这种方式实现是因为它更简单,需要更新的代码更少,并且不改变 VFS API,这可能是当时的担忧。
当您打开 /dev/autofs_nowait
并遍历路径时,您会触发自动挂载,但不要等待它们完成(否则您的进程会阻塞,直到文件系统被挂载或操作超时后) ,因此即使一切正常,您在打开文件时也可能会收到 ENOENT
。
OTOH,/dev/autofs_notrigger
使进程甚至不会触发自动挂载。
这就是所有这些设备所做的。问题是,在 Darwin 的实现中,即使使用 O_NONBLOCK
或 O_NDELAY
.
遍历文件系统时 open
也可能会阻塞
您可以按照 vfs 的流程,从 vnode
的 open
操作开始:
vn_open
-> vn_open_auth
->
namei
-> lookup
-> ...
在那条道路上没有处理(非)阻塞行为。
在整个 CoreFoundation framework source, POSIX filesystem API calls (e.g. open()
, stat()
, et al…) are wrapped in an idiom 中,在进行 POSIX 调用之前,使用 open(…, 0)
获取 /dev/autofs_nowait
上的描述符;之后描述符在作用域退出之前是 close()
。
这样做有什么好处?有什么风险?
获取
/dev/autofs_nowait
描述符是否对任何如此包装的open()
调用(例如O_NONBLOCK
的标志有任何影响,或者是否受其影响)?/dev
在我的机器上,运行 OS X 10.10.5 还有其他“autofs”条目:…none 其中有
man
页可用。如果这些类似文件的设备可以提供这方面的好处,我也很想听听它们的使用情况,因为它可能与此有关。
附录:关于这个主题我找不到太多信息; Google Plus post from 2011 声称:
[t]his file is a special device that's monitored by the autofs filesystem implementation in the kernel. When opened, the autofs filesystem will not block that process on any I/O operations on an autofs file system.
我不太确定那是什么意思(他们专门谈论 launchd
是如何工作的,FWIW)但我自己对此很好奇,所以我写了 a quick context-manager-y RAII struct to try it out – 非目标分析显示测试POSIX 调用完成得更快,但在一般哈希标记内;在了解更多有关其工作原理的背景知识后,我将仔细研究此策略。
这些设备允许实现者避免为功能定义新的 syscall
或 ioctl
,并且可能以这种方式实现是因为它更简单,需要更新的代码更少,并且不改变 VFS API,这可能是当时的担忧。
当您打开 /dev/autofs_nowait
并遍历路径时,您会触发自动挂载,但不要等待它们完成(否则您的进程会阻塞,直到文件系统被挂载或操作超时后) ,因此即使一切正常,您在打开文件时也可能会收到 ENOENT
。
OTOH,/dev/autofs_notrigger
使进程甚至不会触发自动挂载。
这就是所有这些设备所做的。问题是,在 Darwin 的实现中,即使使用 O_NONBLOCK
或 O_NDELAY
.
open
也可能会阻塞
您可以按照 vfs 的流程,从 vnode
的 open
操作开始:
vn_open
->vn_open_auth
->namei
->lookup
-> ...
在那条道路上没有处理(非)阻塞行为。