AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 409107
Accepted
Harv
Harv
Asked: 2017-12-06 21:51:34 +0800 CST2017-12-06 21:51:34 +0800 CST 2017-12-06 21:51:34 +0800 CST

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

  • 772

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. Diálogo de ejeção 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.

osx process
  • 2 2 respostas
  • 296 Views

2 respostas

  • Voted
  1. Giacomo Catenazzi
    2017-12-07T08:58:00+08:002017-12-07T08:58:00+08:00

    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.

    • 0
  2. Best Answer
    thrig
    2017-12-07T09:02:43+08:002017-12-07T09:02:43+08:00

    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 realmente interromper a ejeção, mas antes disso precisamos de alguma depuração do processo, aqui fornecida pelo DTrace executado em algum outro terminal

    $ sudo dtruss -p 66433
    ...
    

    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 dtrussnão mostrou nada:

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

    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

    $ 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 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)

    $ cat /Volumes/Firmware/mlatu
    mlatu
    mlatu
    $ 
    

    e novamente forçamos a ejeção, e o programa percebe isso (mas continua rodando, porque foi escrito assim):

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

    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 cwde 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 o mlatuarquivo 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, em vez disso, use TextEditou algo assim, se você não tiver Hex Fiendinstalado) e mais uma vez faça a dança de ejeção de força ...

    $ screencapture -w error.png
    $ 
    

    demônio hexadecimal usando erro de partição

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

    • 0

relate perguntas

  • Maneira mais rápida de determinar se o conteúdo do diretório mudou desde a última vez

  • Como uso `at` para agendar um script para execução no macOS?

  • csplit não reconhece o regexp fornecido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve