在我的 Mac 上,当我“弹出”网络安装的共享时,我的 Mac 向我显示以下消息,并尝试让进程关闭打开的文件句柄并干净地卸载共享。我的问题是,它究竟是如何实现的?我想它会枚举使用我的共享路径打开的文件句柄,然后向拥有这些文件句柄的进程发送某种信号?只是一个猜测,请告诉我,我对此很好奇。
我考虑过在 Apple stack exchange 上问这个问题,但我猜这实际上是一个更普遍适用的 UNIX 问题。如果我错了,macOS 有一种特殊的/新的方式来做这个,这个问题需要关闭并在那里重新打开,请告诉我。
它没有。它只是卸载文件系统,所以当程序试图再次访问文件系统时,它会出错(希望它能顺利解决问题)。
与您物理分离外部磁盘(或 USB 笔)的情况没有太大区别。文件系统不再可用,但程序会在第一次使用后看到它。
我不知道,但有一个随机的 USB 记忆棒和一个程序
我们确实可以停止弹出,但在此之前我们需要对进程进行一些调试,此处由在其他终端运行的 DTrace 提供
然后通过英文所谓的强制弹出按钮,点击几下,延迟和警告,测试程序仍在运行,USB 记忆棒已卸载,并且
dtruss
没有显示任何内容:因此,至少对于一个标准的 unix 程序来说,除了挂载点被从它下面移除之外什么都没有发生。接下来我们可以测试向挂载点写入一些东西,同样是使用标准的 unix 程序
在其他地方我们确认猫出现了(如果你使用一些更高级别的写函数,缓冲可能是个问题)
我们再次强制弹出,程序确实注意到了这一点(但继续运行,因为它是这样写的):
因此 Mac OS X 10.11(因为这个硬件太旧而无法运行 macOS)如问题中所述“试图让进程关闭打开的文件句柄”没有任何作用,并且没有证据表明“某种信号 [已发送]拥有这些文件句柄的进程”发生;相反,该进程继续运行,如果它进行任何类型的错误检查,那么它可能会失败,具体取决于它的编写方式。
至少对于具有标准 unix
cwd
并使用标准 I/O 调用的标准 unix 程序;也许 Apple 框架程序有些不同?让我们再次重新安装 USB 记忆棒并使用...打开mlatu
文件Hex Fiend.app
TextEdit
(或者如果你没有安装,则使用或其他东西Hex Fiend
)并再次执行强制弹出舞蹈......现在我们收到了与标准 unix 程序不同的消息,并且没有强制卸载的选项。