Como 'eject' obtém processos para fechar identificadores de arquivo?

2
No meu Mac, quando eu ejeto um compartilhamento montado em rede, meu Mac me apresenta a seguinte mensagem e tenta fazer com que os processos fechem as alças de arquivos abertos e desmontem o compartilhamento. Minha pergunta é: como exatamente isso é feito? Eu suponho que ele enumera identificadores de arquivos abertos com o caminho do meu compartilhamento e, em seguida, envia algum tipo de sinal para os processos que possuem esses identificadores de arquivo? Apenas um palpite, por favor, preencha-me, estou muito curioso sobre isso. Eu pensei em perguntar isso na troca de pilha da Apple, mas eu estou supondo que esta é realmente uma questão UNIX mais aplicável em geral. Se eu estiver errado e o macOS tiver uma maneira especial / nova de fazer isso e essa questão precisar ser fechada e reaberta, apenas me avise.

EDIT: imagem adicionada.

    
por Harv 06.12.2017 / 06:51

2 respostas

0

Eu não sei, mas com um stick USB aleatório e um programa

$ 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

Podemos, de fato, parar a ejeção, mas antes disso precisamos de alguma depuração do processo, aqui fornecida pelo DTrace em algum outro terminal

$ sudo dtruss -p 66433
...

E, em seguida, o que em inglês é chamado de botão de ejeção de força, alguns cliques, atrasos e avisos depois, o programa de teste ainda está em execução e o stick USB desmontado e dtruss não mostrou nada:

...
^C
$ lsof -p 66433 | grep cwd
perl5.26 66433 jhqdoe  cwd        cwd|rtd info error: No such file or directory
$ 

Assim, pelo menos para um programa unix padrão, nada aconteceu além do ponto de montagem ser removido por baixo dele. Em seguida, podemos testar escrever algo no ponto de montagem, novamente com um programa unix padrão

$ 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

e em outros lugares, confirmamos que os gatos estão aparecendo (o buffer pode ser um problema se você usar alguma função de gravação de nível superior)

$ cat /Volumes/Firmware/mlatu
mlatu
mlatu
$ 

e novamente forçamos a ejetar, e o programa percebe isso (mas continua rodando, porque foi escrito dessa forma):

$ perl writeslow
hmm Input/output error at writeslow line 7.
hmm Input/output error at writeslow line 7.

para que o Mac OS X 10.11 (para este hardware é muito antigo para executar o macOS) não faz nada para "tentar obter processos para fechar identificadores de arquivos abertos", como afirmado na pergunta, e não há provas "algum tipo de sinal [ é enviado] para os processos que possuem esses identificadores de arquivo "acontece; em vez disso, o processo continua sendo executado e, se ocorrer algum tipo de verificação de erros, talvez ele falhe, dependendo de como foi escrito.

Pelo menos para programas unix padrão que possuem o unix padrão cwd e usam chamadas de E / S padrão; Talvez os programas da Apple sejam de alguma forma diferentes? Vamos remontar o stick usb novamente e abrir o arquivo mlatu com 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
$ 

(ou use TextEdit ou algo assim se você não tiver Hex Fiend instalado) e mais uma vez faça a força ejetar a dança ...

$ screencapture -w error.png
$ 

e agora recebemos uma mensagem diferente da dos programas unix padrão e nenhuma opção para forçar a desmontagem.

    
por 06.12.2017 / 18:02
0

Isso não acontece. Apenas desmonta o sistema de arquivos, então quando um programa tentar acessar novamente o sistema de arquivos, ele terá um erro (e esperamos que ele tente resolver as coisas sem problemas).

Não muito diferente do caso, você desanexa fisicamente um disco externo (ou caneta USB). O sistema de arquivos não está mais disponível, mas os programas o verão logo após o primeiro uso.

    
por 06.12.2017 / 17:58