Когда вы удаляете файл, вы действительно удаляете ссылку на файл (на индекс). Если кто-то уже открыл этот файл, он может сохранить дескриптор файла, который у него есть. Файл остается на диске, занимая место, и может быть записан и прочитан, если у вас есть к нему доступ.
unlink
Функция определяется с помощью такого поведения POSIX:
Когда счетчик ссылок на файл становится равным 0, и ни один процесс не имеет открытого файла, пространство, занимаемое файлом, должно быть освобождено, и файл больше не будет доступен. Если один или несколько процессов открывают файл при удалении последней ссылки, ссылка должна быть удалена до возврата unlink (), но удаление содержимого файла должно быть отложено до тех пор, пока все ссылки на файл не будут закрыты .
Этот совет из-за такого поведения. У демона будет открытый файл, и он не заметит, что он был удален (если он не контролировал его специально, что редко). Он будет беспечно записывать в существующий дескриптор файла: он будет занимать (больше) места на диске, но вы не сможете увидеть ни одно из сообщений, которые он пишет, так что вы действительно в худшем обоих миров. Если вместо этого вы усекаете файл до нулевой длины, пространство сразу освобождается, и любые новые сообщения будут добавляться в новом конце файла, где вы сможете их увидеть.
В конце концов, когда демон завершает работу или close
создает файл , пространство освобождается. Никто новый не может открыть файл за это время (кроме как через отражающие интерфейс системы, такие как Linux/proc/x/fd/...
). Также гарантируется, что:
Если счетчик ссылок файла равен 0, когда все файловые дескрипторы, связанные с файлом, закрыты, пространство, занимаемое файлом, должно быть освобождено, и файл больше не будет доступен.
Таким образом, вы не теряете свое дисковое пространство навсегда, но вы ничего не получаете, удаляя файл, и вы теряете доступ к новым сообщениям.
/proc/x/fd/y
? Это приведет к тому, что процесс не сможет записать в дескриптор файла, или это недопустимая операция?