Нет бита, который помечает файл как временный файл.
Каждый индекс имеет поле количество ссылок , которое представляет собой число записей каталога, которые ссылаются на файл. Каждый раз, когда вы делаете жесткую ссылку на файл, это число увеличивается, а когда вы удаляете имя, оно уменьшается; когда счетчик обнуляется, файл удаляется (индекс помечается как доступный, и все блоки данных помещаются в свободный список).
Когда файл открывается в процессе, копия индекс хранится в таблице файлов ядра, а количество дескрипторов файлов, которые ссылаются на него, добавляется в счетчик ссылок в этой копии. Когда процесс закрывает свой файловый дескриптор, счетчик ссылок уменьшается. Файл фактически не удаляется до тех пор, пока количество ссылок в памяти не упадет до нуля. Это то, что сохраняет файл на диске, пока он открыт, даже если все имена удалены.
Поэтому, когда вы создаете временный файл, он выполняет следующие шаги:
- Создает файл. Количество ссылок inode на диске = 1.
- Открывает файл. Количество ссылок на inode ядра = 2.
- Удаляет имя файла. Количество ссылок на inode ядра = 1.
На этом этапе процесс может продолжать использовать временный файл, но он не может быть открыт другим процессом, поскольку у него нет имени.
Когда процесс закрывает дескриптор файла, счетчик ссылок становится равным 0, и файл удаляется.
Последние версии Linux имеют флаг O_TMPFILE
для open(2)
, который автоматизирует это. Вместо указания имени файла вы просто указываете каталог, который просто используется для поиска файловой системы для хранения данных файла. Когда это используется, он фактически делает все 3 шага выше в одном вызове, но фактически никогда нигде не создает имя файла (таким образом, избегаются условия гонки и конфликты имен).