Primeiro de tudo, o que é um buraco em um arquivo? É apenas o conjunto de dados para zero sem ser explicitamente escrito como tal. Quando você seek
1639 bytes após o final do arquivo e grava 100 bytes nele, seu arquivo aumentou 1639 + 100 bytes. Então, você criou um buraco, mas esse buraco está preenchido com zeros.
Se esse buraco for grande o suficiente, certos sistemas de arquivos (como ext
) permitem que você poupe esse espaço não alocando os blocos correspondentes no disco. Ou seja Se o seu seek
for escrever um ou mais blocos de zeros, os blocos não serão alocados no disco e isso criará buracos reais na lista de blocos que contêm os dados do arquivo. Isso é o que chamamos de arquivo esparso .
O tamanho de um bloco depende da maneira como seu FS é formatado. Hoje em dia com ext
é geralmente 4096 bytes. Isso significa que, com sua busca de 1639 bytes, você não está criando um arquivo esparso e 1639 zeros serão gravados no disco. OTOH, com blocos de 4096 bytes, se você procura pelo menos 8191 (2 * 4096 - 1) bytes, pode ter a certeza de criar pelo menos um.
Como os blocos não são realmente alocados e preenchidos com zeros, isso faz com que seu arquivo use menos espaço em disco e sua operação de gravação seja muito mais rápida. Obviamente, para responder à sua pergunta, o espaço em disco poupado está disponível para outros arquivos.
Na verdade, a melhor demonstração não requer um programa em C:
$ df -h /tmp
Filesystem Size Used Avail Use% Mounted on
/dev/sda4 38G 28G 7.5G 80% /
$ time dd of=/tmp/foo bs=1M seek=$((1024*1024*10)) count=0
0+0 records in
0+0 records out
0 bytes (0 B) copied, 4.741e-05 s, 0.0 kB/s
real 0m0.002s
user 0m0.000s
sys 0m0.000s
$ ls -lh /tmp/foo
-rw-r--r-- 1 xhienne xhienne 10T Aug 25 20:08 /tmp/foo
$ df -h /tmp
Filesystem Size Used Avail Use% Mounted on
/dev/sda4 38G 28G 7.5G 80% /
Aqui eu criei um arquivo de 10 TB (cheio de zeros) em alguns milissegundos em uma partição que tem apenas 7 GB ou mais de espaço livre (que ainda está disponível).