Ao excluir um arquivo, você realmente remove um link para o arquivo (para o inode). Se alguém já tiver esse arquivo aberto, ele manterá o descritor de arquivo que possui. O arquivo permanece no disco, ocupando espaço, e pode ser gravado e lido se você tiver acesso a ele.
A unlink
função é definida com este comportamento pelo POSIX:
Quando a contagem de links do arquivo se tornar 0 e nenhum processo tiver aberto o arquivo, o espaço ocupado pelo arquivo será liberado e o arquivo não estará mais acessível. Se um ou mais processos tiverem o arquivo aberto quando o último link for removido, o link será removido antes do retorno de unlink (), mas a remoção do conteúdo do arquivo será adiada até que todas as referências ao arquivo sejam fechadas .
Este conselho por causa desse comportamento. O daemon terá o arquivo aberto e não notará que ele foi excluído (a menos que o estivesse monitorando especificamente, o que é incomum). Ele continuará gravando alegremente o descritor de arquivo existente: você continuará ocupando (mais) espaço no disco, mas não poderá ver nenhuma das mensagens gravadas; portanto, você está realmente no pior dos dois mundos. Se você truncar o arquivo com tamanho zero, o espaço será liberado imediatamente e quaisquer novas mensagens serão anexadas no novo final do arquivo, onde você poderá vê-las.
Eventualmente, quando o daemon finalizar ou for close
o arquivo , o espaço será liberado. Entretanto, ninguém novo pode abrir o arquivo (exceto por meio de interfaces reflexivas específicas do sistema, como as do Linux/proc/x/fd/...
). Também é garantido que:
Se a contagem de links do arquivo for 0, quando todos os descritores de arquivos associados ao arquivo forem fechados, o espaço ocupado pelo arquivo será liberado e o arquivo não estará mais acessível.
Portanto, você não perde seu espaço em disco permanentemente, mas não ganha nada ao excluir o arquivo e perde acesso a novas mensagens.
/proc/x/fd/y
? Isso faria com que o processo falhasse ao gravar no descritor de arquivo ou é uma operação ilegal?