Process

“彈出”如何讓程序關閉文件句柄?

  • December 6, 2017

在我的 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 $$到擁有這些文件句柄的程序”發生;相反,該程序繼續執行,如果它進行任何類型的錯誤檢查,那麼它可能會失敗,具體取決於它的編寫方式。 至少對於具有標準 unixcwd並使用標準 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 程序不同的消息,並且沒有強制解除安裝的選項。

引用自:https://unix.stackexchange.com/questions/409107