No meu Mac, quando eu 'ejeto' um compartilhamento montado na rede, meu Mac me apresenta a seguinte mensagem e tenta obter processos para fechar identificadores de arquivos abertos e desmontar o compartilhamento de forma limpa. Minha pergunta é: como exatamente isso é feito? Suponho que ele enumera os identificadores de arquivo 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 me preencha, estou muito curioso sobre isso. Pensei em perguntar isso na troca de pilhas da Apple, mas acho que essa é, na verdade, uma pergunta de aplicação geral do UNIX. Se eu estiver errado e o macOS tiver uma maneira especial/nova de fazer isso e essa pergunta precisar ser fechada e reaberta lá, é só me avisar.
EDIT: captura de tela adicionada.
Não. Ele apenas desmonta o sistema de arquivos, portanto, quando um programa tentar acessar novamente o sistema de arquivos, haverá um erro (e esperamos que tente resolver as coisas sem problemas).
Não muito diferente no caso de você desconectar fisicamente um disco externo (ou pen USB). O sistema de arquivos não está mais disponível, mas os programas o verão logo após o primeiro uso.
Eu não sei, mas com um stick USB aleatório e um programa
Podemos realmente interromper a ejeção, mas antes disso precisamos de alguma depuração do processo, aqui fornecida pelo DTrace executado em algum outro terminal
E então, através do que em inglês é chamado de botão de ejeção forçada, alguns cliques e atrasos e avisos posteriores, o programa de teste ainda está em execução e o pendrive desmontado e
dtruss
não mostrou nada:Portanto, pelo menos para um programa unix padrão, nada aconteceu além do ponto de montagem sendo removido dele. Em seguida, podemos testar a gravação de algo no ponto de montagem, novamente com um programa unix padrão
e em outro lugar, 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)
e novamente forçamos a ejeção, e o programa percebe isso (mas continua rodando, porque foi escrito assim):
portanto, o Mac OS X 10.11 (pois este hardware é muito antigo para executar o macOS) não faz nada para "tentar fazer com que os processos fechem os identificadores de arquivos abertos", conforme afirmado na pergunta, e não há evidências de "algum tipo de sinal [é enviado] aos processos que possuem esses manipuladores de arquivo" acontece; em vez disso, o processo continua em execução e, se fizer algum tipo de verificação de erro, talvez 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 estruturados da Apple sejam de alguma forma diferentes? Vamos remontar o stick USB novamente e abrir omlatu
arquivo comHex Fiend.app
...(ou, em vez disso, use
TextEdit
ou algo assim, se você não tiverHex Fiend
instalado) e mais uma vez faça a dança de ejeção de força ...e agora recebemos uma mensagem diferente da dos programas unix padrão e nenhuma opção para forçar a desmontagem.