Eu notei que no sistema operacional não-windows .... ou seja, linux / mac eu posso fazer coisas como: - Enviar um zip para um amigo acima do objetivo - Excluir o arquivo enquanto ele estiver sendo transferido
E a transferência não falha.
Ou posso executar operações como .. - iniciar um filme - apagar o arquivo - o filme ainda é reproduzido até a conclusão (leitura do disco, não apenas buffer na memória)
Embora os arquivos estejam sendo "excluídos", como mencionei, na verdade eles estão sendo movidos para um local diferente no sistema de arquivos ... ou seja, em um diretório da Lixeira ou algo assim. Portanto, parece-me que o sistema operacional usa um ponteiro @ no arquivo que é atualizado quando se move, em vez de acessar os arquivos diretamente.
Alguém pode lançar alguma luz sobre como esse recurso IMPRESSIONANTE é realmente implementado? Não tenho certeza do que pesquisar no Google para saber mais.
obrigado.
fonte
Respostas:
A entrada do diretório é apenas um ponteiro para um inode. O inode contém as meta-informações sobre o arquivo (exceto o nome) e ponteiros para os dados do arquivo (se houver). Quando você começa a copiar um arquivo, recebe um identificador para o inode.
O sistema operacional mantém uma contagem de referências ao inode. Desde que haja referências ao inode, o inode e os dados do arquivo são mantidos. Depois 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 cópia, ele será mantido até que seu processo feche o arquivo. Isso deve ocorrer quando a transferência do arquivo terminar e ocorrerá se o processo de cópia falhar. Se a transferência do arquivo falhar parcialmente e você tiver excluído todos os links físicos do arquivo, não será possível reiniciar a transferência com êxito.
EDIT: Como já mencionado, 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 de diretório original é removida.
É possível ter várias entradas de diretório para o mesmo arquivo. Estes são chamados de links físicos. Eles são criados criando uma nova entrada de diretório para o arquivo sem remover a entrada original. O inode do sistema de arquivos possui uma contagem de referência para registrar o número de entradas do diretório apontando para o arquivo.
EDIT2: Se o processo travar ou for interrompido, o arquivo será removido corretamente, pois a contagem de acessos na memória será reduzida a zero. Essa é a ação que ocorre quando o programa termina normalmente.
No caso de falta de energia ou outro desligamento desordenado 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 no disco e das estruturas de diretório, o espaço será recuperado, o arquivo permanecerá no diretório ou uma nova entrada será feita nolost+found
diretório. Os resultados dependerão de quais alterações foram liberadas para o disco ou gravadas no diário dos sistemas de arquivos.fonte
/tmp
e imediatamenteunlink(2)
o arquivo . Nesse ponto, não há arquivo em um diretório (portanto, nada para limpar na saída ou falha), mas seu processo ainda tem acesso ao arquivo e nenhum outro processo pode mexer acidental ou deliberadamente com ele. Isso ilustra a propriedade de interesse.Conforme explicado por Matt Jenkins, o sistema operacional (o sistema de arquivos) controla os arquivos mantidos abertos pelos aplicativos. Enquanto um processo mantém um arquivo aberto, seus dados permanecem no disco (mesmo que tenham sido excluídos e não sejam mais visíveis ou acessíveis 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. Esta é uma FAQ para operações de sistema de arquivos Linux / Unix: "O comando 'df' diz que a partição está cheia, enquanto 'du' relata espaço livre" (consulte, por exemplo, http://batleth.sapienti-sat.org/projects/FAQs/ext3- faq.html ). 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 (geralmente um problema com os arquivos de log).
fonte
Na verdade, é bastante simples. O arquivo mantém uma lista de referências - processos que estão acessando o arquivo. Quando você exclui o arquivo, ele remove a listagem do diretório, mas não o próprio arquivo. Os programas que ainda têm o arquivo aberto ainda podem acessá-lo. O arquivo só é realmente excluído quando todos os programas que estão acessando o fecham.
Além disso, ao mover o arquivo - se estiver dentro do mesmo sistema de arquivos - o arquivo não se move como tal, apenas altera o ponteiro para o diretório em que o arquivo está.
fonte
Nos sistemas de arquivos unix, um arquivo pode ter um ou mais links físicos para ele. O arquivo permanece 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".
fonte