Qual é o conceito de criar um arquivo com zero bytes no Linux?

31

Se eu fizer o seguinte:

touch /tmp/test

e, em seguida, execute

ls -la /tmp/

Eu pude ver o arquivo test com 0 Bytes no diretório.

Mas como o Sistema Operacional lida com um conceito de 0 Bytes . Se eu colocar em termos leigos:

0 Bytes is no memory at all, hence nothing is created.

A criação de um arquivo, deve ou deve pelo menos exigir certa memória, certo?

    
por Shan-Desai 28.03.2017 / 17:19

7 respostas

63

Um arquivo é (aproximadamente) três coisas separadas:

  • Um "inode", uma estrutura de metadados que controla quem possui o arquivo, as permissões e uma lista de blocos no disco que realmente contêm os dados.
  • Uma ou mais entradas de diretório (os nomes dos arquivos) que apontam para esse inode
  • Os blocos reais de dados em si

Quando você cria um arquivo vazio, cria apenas o inode e uma entrada de diretório apontando para esse inode. O mesmo para arquivos esparsos ( dd if=/dev/null of=sparse_file bs=10M seek=1 ).

Quando você cria hardlinks para um arquivo existente, basta criar entradas de diretório adicionais que apontam para o mesmo inode.

Eu simplifiquei as coisas aqui, mas você entendeu a ideia.

    
por 28.03.2017 / 17:40
23

touch criará um inode e ls -i ou stat mostrará informações sobre o inode:

$ touch test
$ ls -i test
28971114 test
$ stat test
  File: ‘test’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fc01h/64513d    Inode: 28971114    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/1000)   Gid: ( 1000/1000)
Access: 2017-03-28 17:38:07.221131925 +0200
Modify: 2017-03-28 17:38:07.221131925 +0200
Change: 2017-03-28 17:38:07.221131925 +0200
 Birth: -

Observe que test usa 0 blocos. Para armazenar os dados exibidos, o inode usa alguns bytes. Esses bytes são armazenados na tabela de inodes. Olhe para a página ext2 de um exemplo de uma estrutura de inode .

    
por 28.03.2017 / 17:46
19

ls (ou bem, a chamada do sistema stat(2) ) informa o tamanho do conteúdo do arquivo. Quanto espaço o sistema de arquivos precisa para a contabilidade não faz parte disso, e como um detalhe de implementação, não é algo que os programas em geral devam se importar ou mesmo conhecer. Tornar os detalhes da implementação visíveis tornaria a abstração do sistema de arquivos menos útil.

    
por 28.03.2017 / 17:46
9

O arquivo, por si só, não ocupa nenhum espaço, mas o sistema de arquivos armazena o nome do arquivo, a localização, os direitos de acesso a ele e afins.

    
por 28.03.2017 / 17:25
5

Resposta simples: porque está definido dessa forma.

Resposta mais longa: é definida dessa forma porque algumas operações são conceitualmente mais simples:

  • Se um arquivo contiver 20 letras "A" e você remover todos os "A" s, o arquivo ficará 20 bytes mais curto. A mesma operação em um arquivo que consistia apenas em "AAAAAAAAAAAAAAAAAAAA" teria que lidar com o caso especial de um arquivo que está desaparecendo.
  • Mais praticamente, a exclusão da última linha de um arquivo de texto precisaria ser de capa especial.
  • Os editores de texto que fazem backup regularmente precisam de um código de caso especial para lidar com a situação em que o usuário pode excluir a última linha, ir almoçar, depois voltar e adicionar outra linha. Outras complicações surgem se outros usuários criarem um arquivo com esse nome nesse meio tempo.

Você pode fazer mais coisas: * Arquivos de log de erros tendem a ser criados vazios, para serem preenchidos se e somente se ocorrer um erro. * Para descobrir quantos erros ocorreram, conte o número de linhas nos arquivos de log. Se o arquivo de log estiver vazio, o número de erros é zero, o que faz todo o sentido. * Às vezes, você vê arquivos em que todo o texto relevante está no nome do arquivo, por exemplo, %código%. Isso impede que administradores sobrecarregados excluam diretórios vazios após a instalação e também evita erros nos quais um programa ou usuário cria acidentalmente um arquivo no qual o programa gostaria de ver um diretório mais tarde. O programa this-is-the-logging-directory (e outros) tendem a ignorar diretórios vazios, e se um projeto / administrador / usuário quiser ter um registro de que o diretório existe mesmo que não tenha conteúdo útil (ainda), você poderá ver um arquivo vazio chamado git ou empty .

Nenhuma operação se torna mais complicada:

  • Concatenando arquivos: isso é apenas um não operacional com um arquivo vazio.
  • Procurando por uma string em um arquivo: isso é coberto pelo caso padrão de "se o arquivo for menor que o termo de pesquisa, ele não pode conter o termo de pesquisa".
  • Leitura do arquivo: os programas precisam lidar com o final do arquivo antes que eles tenham o esperado, então, novamente, o caso de um arquivo de comprimento zero não envolve pensamento extra para o programador: ele simplesmente acertará fim do arquivo desde o começo.

No caso dos arquivos, o aspecto "há um arquivo gravado em algum lugar" (inode e / ou nome do arquivo) vem em cima das considerações acima, mas os sistemas de arquivos não fariam isso se os arquivos vazios fossem inúteis.

Em geral, todos os motivos acima, exceto aqueles relacionados a nomes de arquivos, se aplicam a seqüências. Mais notavelmente para strings, que são sequências de caracteres: Strings de comprimento zero são comuns dentro dos programas. As cadeias de caracteres geralmente não são permitidas no nível do usuário, se não fizerem sentido: um nome de arquivo é uma cadeia de caracteres e a maioria dos sistemas de arquivos não permite uma cadeia vazia como um nome de arquivo; internamente, ao criar nomes de arquivos a partir de fragmentos, o programa pode ter uma string vazia como um dos fragmentos.

    
por 30.03.2017 / 03:47
1

Usando a analogia mais simples:

Vamos comparar um arquivo com, digamos, um copo de água.

'touch / tmp / test' é muito parecido com criar um copo vazio, sem água. O copo está vazio, então o tamanho é zero. Mas o copo existe.

No jargão do sistema de arquivos, o vidro é o metadado, enquanto o conteúdo do vidro é o dado. Os meta-dados contêm todos os tipos de coisas, como mencionado nos posts anteriores.

Arquivos de tamanho zero podem ser úteis. Um exemplo é usá-los como um breadcrumb, onde sua mera existência pode ser usada para indicar algum tipo de estado (ou seja, se o arquivo existir: então faça alguma coisa; se não: ignore).

    
por 31.03.2017 / 03:13
0

Pense desta forma: diga que um programa está rastreando consultas SQL enviadas ao seu servidor. O programa deseja indicar que está registrando solicitações em um arquivo de texto simples, mas nenhuma solicitação foi registrada. Como isso deve ser? Eu diria que deveria ser um arquivo de tamanho zero em /var/log/acme-sql-server/queries.log . Dessa forma, você pode descobrir quando o registro foi iniciado (o tempo de criação do arquivo), quando foi atualizado pela última vez (ou seja, quando foi criado), quantas consultas foram gravadas (número de novas linhas no arquivo = 0) e quem está fazendo o registro (Acme SQL Server). Para casos como esse, é útil ter o conceito de um arquivo vazio que, no entanto, existe em um local específico.

    
por 04.04.2017 / 23:48