在 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()



附录:关于这个主题我找不到太多信息; 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 调用完成得更快,但在一般哈希标记内;在了解更多有关其工作原理的背景知识后,我将仔细研究此策略。

这些设备允许实现者避免为功能定义新的 syscallioctl,并且可能以这种方式实现是因为它更简单,需要更新的代码更少,并且不改变 VFS API,这可能是当时的担忧。

当您打开 /dev/autofs_nowait 并遍历路径时,您会触发自动挂载,但不要等待它们完成(否则您的进程会阻塞,直到文件系统被挂载或操作超时后) ,因此即使一切正常,您在打开文件时也可能会收到 ENOENT

OTOH,/dev/autofs_notrigger 使进程甚至不会触发自动挂载。

这就是所有这些设备所做的。问题是,在 Darwin 的实现中,即使使用 O_NONBLOCKO_NDELAY.

遍历文件系统时 open 也可能会阻塞

您可以按照 vfs 的流程,从 vnodeopen 操作开始:

在那条道路上没有处理(非)阻塞行为。