Win32 CreateFile
имеет FILE_FLAG_DELETE_ON_CLOSE
, но я нахожусь в Linux.
Я хочу открыть временный файл, который всегда будет удален после завершения программы. Я мог понять, что в случае сбоя программы может быть нецелесообразно гарантировать это, но в любом другом случае я бы хотел, чтобы он работал.
Я знаю об RAII. Я знаю о сигналах. Я знаю о atexit(3)
. Я знаю, что могу открыть файл и немедленно удалить его, и файл останется доступным до тех пор, пока дескриптор файла не будет закрыт (что даже приведет к сбою). Ни одно из них не похоже на полное и простое решение:
- RAII: был там, сделал это: у меня есть объект, деструктор которого удаляет файл, но деструктор не вызывается, если программа завершается сигналом. Сигналы
- : Я пишу низкоуровневую библиотеку, которая делает запись обработчика сигнала сложным предложением. Например, что, если приложение использует сигналы самостоятельно? Я не хочу наступать на все пальцы. Я мог бы подумать о некотором умном использовании
sigaction(2)
, чтобы справиться... но пока не задумался над этой возможностью. -
atexit(3)
: кажется бесполезным, поскольку он не вызывается во время аномального завершения (например, через сигнал). - preemptive
unlink(2)
: это довольно хорошо, за исключением того, что мне нужно, чтобы файл оставался видимым в файловой системе (в противном случае системе сложнее отслеживать/устранять неполадки).
Что бы вы сделали здесь?
Дальнейшее объяснение
Я удалил одну деталь в своем оригинальном посте, и теперь я понял, что должен был включить. "Файл" в этом случае не является строго нормальным файлом, а скорее представляет собой очередь сообщений POSIX. Я создаю его через mq_open()
. Его можно закрыть с помощью mq_close()
или close()
(первый - это псевдоним для последней в моей системе). Его можно удалить из системы через mq_unlink()
. Все это делает его аналогичным регулярному файлу, за исключением того, что я не могу выбрать каталог, в котором находится файл. Это делает текущий самый популярный ответ (размещение файла в /tmp
) неработоспособным, потому что "файл" создается системой в виртуальной файловой системе с очень ограниченной емкостью. (Я установил виртуальную файловую систему в /dev/mqueue
, следуя примеру в man mq_overview
).
Это также объясняет, почему мне нужно, чтобы имя оставалось видимым (что делает немедленный подход незаменимым): "файл" должен быть разделен между двумя или более процессами.