"팝"은 어떻게 프로세스가 파일 핸들을 닫게 합니까?

"팝"은 어떻게 프로세스가 파일 핸들을 닫게 합니까?

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 펜)를 물리적으로 분리하는 것과 크게 다르지 않습니다. 파일 시스템은 더 이상 사용할 수 없지만 처음 사용한 후에는 프로그램에서 이를 볼 수 있습니다.

관련 정보