Movendo um arquivo enquanto ele estiver em uso - Como funciona?

28

Eu notei que em SO não-windows .... ou seja, linux / mac eu posso fazer coisas como: - Envie um zip para um amigo por cima do objetivo - Apague o arquivo enquanto estiver em transferência

E a transferência não falha.

Ou eu posso fazer operações como ... - comece um filme - apaga o arquivo - o filme ainda é reproduzido até o fim (lido do disco, não apenas armazenado na memória)

Embora os arquivos estejam sendo "excluídos", como mencionei, eles estão sendo movidos para um local diferente no sistema de arquivos ... ou seja, um diretório Lixeira ou algo assim. Então, parece-me que o sistema operacional usa um ponteiro @ o arquivo que é atualizado quando se move em vez de acessar os arquivos diretamente.

Alguém pode lançar alguma luz sobre como esse recurso AWESOME é realmente implementado? Eu nem tenho certeza do que procurar no Google para saber mais sobre isso.

obrigado.

    
por Mario Zigliotto 27.02.2011 / 21:20

4 respostas

26

A entrada de diretório é apenas um ponteiro para um inode. O inode contém as meta-informações sobre o arquivo (além do nome) e os ponteiros para os dados do arquivo (se houver). Quando você começa a copiar um arquivo, você obtém um identificador para o inode.

O sistema operacional mantém uma contagem de referências ao inode. Enquanto houver referências ao inode, os dados do inode e do arquivo serão mantidos. Uma vez que todas as referências ao inode são removidas, o inode é e o espaço requerido pelo arquivo é liberado.

Como você tem o arquivo aberto para copiá-lo, ele será mantido até que seu processo feche o arquivo. Isso deve ocorrer quando a transferência de arquivos for concluída e ocorrerá se o processo de cópia falhar. Se a transferência de arquivos falhar no meio e você tiver excluído todos os links para o arquivo, não será possível reiniciar a transferência com êxito.

EDIT: Como outros já notaram, as movimentações de arquivos no mesmo dispositivo são feitas sem mover os dados. Em vez disso, uma nova entrada de diretório é criada no diretório de destino e a entrada do diretório original é removida.

É possível ter várias entradas de diretório para o mesmo arquivo. Estes são chamados hard links. Eles são criados fazendo uma nova entrada de diretório para o arquivo sem remover a entrada original. O inode do sistema de arquivos tem uma contagem de referência para registrar o número de entradas de diretório apontando para o arquivo.

EDIT2: Se o processo falhar ou for eliminado, o arquivo será removido de forma limpa, pois a contagem de acesso à memória será reduzida a zero. Esta é a ação que ocorre quando o programa termina normalmente.

No caso de uma falha de energia ou outro desligamento não-ordenado do sistema, o disco precisará de uma fsck (verificação do sistema de arquivos) antes de poder ser totalmente montado. Dependendo do estado do inode em disco e das estruturas de diretório, o espaço será recuperado, o arquivo permanecerá no diretório ou uma nova entrada será feita no diretório lost+found . Os resultados dependerão de quais alterações foram liberadas para o disco ou gravadas no diário de sistemas de arquivos.

    
por 28.02.2011 / 05:38
5

Como explicado por Matt Jenkins, o sistema operacional (o sistema de arquivos) mantém o controle dos arquivos que são mantidos abertos pelos aplicativos. Enquanto um processo mantém um arquivo aberto, seus dados permanecem no disco (mesmo que ele tenha sido excluído e não esteja mais visível ou acessível a outros programas.

Observe que uma conseqüência disso é que o espaço ocupado por um arquivo só pode ser recuperado depois que o último processo que o utiliza o fechou. Essa é uma FAQ para operações do sistema de arquivos Linux / Unix: "o comando 'df' diz que a partição está cheia, enquanto 'du' reporta espaço livre" (veja, por exemplo, link ). Se você precisar liberar espaço, não é suficiente excluir arquivos grandes (por exemplo, arquivos de log), você também deve garantir que nenhum processo os mantenha abertos (normalmente um problema com arquivos de log).

    
por 27.02.2011 / 22:27
2

É bem simples na verdade. O arquivo mantém uma lista de referências - processos que estão acessando o arquivo. Quando você exclui o arquivo, ele apenas remove a listagem do diretório, mas não o arquivo em si. Os programas que ainda têm o arquivo aberto ainda podem acessá-lo. O arquivo só é realmente excluído quando todos os programas que o acessam o fecham.

Além disso, ao mover o arquivo - se ele estiver dentro do mesmo sistema de arquivos - o arquivo não é realmente movido como tal, ele apenas altera o ponteiro para o diretório no qual o arquivo está.

    
por 27.02.2011 / 21:28
0

Em sistemas de arquivos unix, um arquivo pode ter um ou mais hard links . O arquivo tem vida enquanto houver pelo menos um. Quando o último é removido, o espaço do arquivo é liberado. O link acima fornecerá um ponto de partida para mais leituras. Consulte especialmente a seção "Contador de links".

    
por 27.02.2011 / 22:05