「ポップ」はどのようにプロセスがファイルハンドルを閉じるのですか?

「ポップ」はどのようにプロセスがファイルハンドルを閉じるのですか?

Macがネットワークにマウントされた共有を「取り出す」と、Macに次のメッセージが表示され、プロセスで開かれたファイルハンドルを閉じて共有を完全にアンマウントしようとします。私の質問は、これが正確にどのように達成されるかです。私の共有パスを使用して開いたファイルハンドルを列挙し、そのファイルハンドルを所有しているプロセスに何らかのシグナルを送信するようです。推測だけです。気になります。入力してください。 ポップアップダイアログ Apple Stack Exchangeにこの質問をしようとしましたが、実際にはこれがより一般的に適用されるUNIXの質問のようです。私が間違っていて、macOSにこれを行うための特別な/新しい方法があり、この問題を閉じて再開する必要がある場合はお知らせください。

編集:スクリーンショットを追加しました。

答え1

わかりませんが、ランダムUSBメモリとプログラムがありました。

$ 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ファイルハンドルが発生しますが、代わりにプロセスは引き続き実行され、どのような種類のエラーチェックを実行しても作成方法によっては失敗する可能性があります。

少なくとも標準のUnixがあり、標準のcwdI / 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
$ 

Hex Demonはパーティショニングエラーを使用します。

これで、標準のUNIXプログラムとは異なるメッセージが表示され、強制的に削除するオプションはありません。

答え2

しかし、実際にはそうではありません。ファイルシステムをアンマウントするだけで、プログラムがファイルシステムに再度アクセスしようとするとエラーが発生します(問題を解決するためにスムーズに取り組んでいきます)。

外付けディスク(またはUSBペン)を物理的に取り外すのと大きく変わりません。ファイルシステムは使用できなくなりますが、初めて使用した後はプログラムで表示できます。

関連情報