“彈出”如何讓程序關閉文件句柄?
在我的 Mac 上,當我“彈出”網路安裝的共享時,我的 Mac 向我顯示以下消息,並嘗試讓程序關閉打開的文件句柄並乾淨地解除安裝共享。我的問題是,它究竟是如何做到這一點的?我想它會列舉使用我的共享路徑打開的文件句柄,然後向擁有這些文件句柄的程序發送某種信號?只是猜測,請填寫,我很好奇。 我想過在 Apple stack exchange 上問這個問題,但我猜這實際上是一個更普遍適用的 UNIX 問題。如果我錯了並且 macOS 有一種特殊/新的方式來做這件事,並且這個問題需要在那里關閉並重新打開,請告訴我。
編輯:添加截圖。
我不知道,但有一個隨機的 U 盤和一個程序
$ df | grep Vol /dev/disk1s2 12228 20 12208 1% 512 0 100% /Volumes/Firmware $ perl -E 'say $$; chdir "/Volumes/Firmware" or die "nope $!"; sleep 9999' 66433
我們確實可以停止彈出,但在此之前我們需要對程序進行一些調試,這裡由 DTrace 提供,在其他一些終端執行
$ sudo dtruss -p 66433 ...
然後通過英文中的強制彈出按鈕,點擊幾下,延遲和警告,測試程序仍在執行,USB記憶棒解除安裝,
dtruss
沒有顯示任何東西:... ^C $ lsof -p 66433 | grep cwd perl5.26 66433 jhqdoe cwd cwd|rtd info error: No such file or directory $
所以至少對於一個標準的 unix 程序來說,除了掛載點被從它下面刪除之外,什麼也沒有發生。接下來我們可以測試向掛載點寫入一些東西,再次使用標準的 unix 程序
$ cat writeslow #!/usr/bin/env perl use 5.14.0; use warnings; open( my $fh, ">", "/Volumes/Firmware/mlatu" ) or die "nope $!"; while (1) { syswrite( $fh, "mlatu\n" ) or warn "hmm $!"; sleep 3; } $ perl writeslow
在其他地方,我們確認貓出現了(如果您使用一些更高級別的寫入功能,緩衝可能是一個問題)
$ cat /Volumes/Firmware/mlatu mlatu mlatu $
我們再次強制彈出,程序確實注意到了這一點(但繼續執行,因為它是這樣寫的):
$ perl writeslow hmm Input/output error at writeslow line 7. hmm Input/output error at writeslow line 7.
所以 Mac OS X 10.11(因為這個硬體太舊了,無法執行 macOS)沒有像問題中所說的那樣“嘗試讓程序關閉打開的文件句柄”,並且沒有證據表明“某種信號
$$ is sent $$到擁有這些文件句柄的程序”發生;相反,該程序繼續執行,如果它進行任何類型的錯誤檢查,那麼它可能會失敗,具體取決於它的編寫方式。 至少對於具有標準 unix
cwd
並使用標準 I/O 呼叫的標準 unix 程序而言;也許Apple框架程序有些不同?讓我們再次重新安裝 USB 記憶棒並使用…打開mlatu
文件Hex Fiend.app
$ open -a Hex\ Fiend /Volumes/Firmware/mlatu $ lsof | grep mlatu Hex\x20Fi 66642 jhqdoe 8r REG 1,5 216 7 /Volumes/Firmware/mlatu $
TextEdit
(或者如果您沒有安裝,則使用或其他東西Hex Fiend
)並再次進行強制彈出舞……$ screencapture -w error.png $
現在我們得到了與標準 Unix 程序不同的消息,並且沒有強制解除安裝的選項。