Apesar de seu nome, rm
não remove o arquivo. Na verdade, ele desvincula - remove o arquivo de referência de entrada de diretório. Se ainda houver links para esse arquivo, os dados serão mantidos intactos.
Quando o programa é executado, o Kernel mantém um tipo de hard links dentro (todos são tratados como o mesmo inode
object), portanto os dados serão mantidos até o último processo fechar o arquivo desvinculado.
Observe como a desvinculação da chamada do sistema é descrita:
If that name was the last link to a file and no processes have the file open the file is deleted and the space it was using is made available for reuse.
If the name was the last link to a file but any processes still have the file open the file will remain in existence until the last file descriptor referring to it is closed.
Por exemplo:
# cp /bin/sleep ./sleep
# ln ./sleep ./sleep2
# ./sleep 1000 &
[1] 24399
# rm ./sleep
Neste ponto, os dados ainda são acessíveis através do hardlink, e o inode ainda é conhecido pelo kernel como (task_struct)->mm->exe_file
:
# ls -lh ./sleep2
-rwxr-xr-x 1 myaut users 31K Jun 17 23:10 ./sleep2
# > ls -l /proc/24399/exe
lrwxrwxrwx 1 myaut users 0 Jun 17 23:11 /proc/24399/exe -> /tmp/test/sleep (deleted)
Mesmo após a exclusão do segundo hardlink, os dados são mantidos (BTW, se você remover o plugue e seu sistema perder energia neste momento, você receberá vazamento de espaço do FS):
# rm ./sleep2
# ls -l /proc/24399/exe
/proc/24399/exe -> /tmp/test/sleep (deleted)
Agora eu mato processo, e só neste momento disco (ou tmpfs) espaço será desalocado:
# kill 24399