Отбрасывать открытые файлы, когда процесс убит

Есть ли способ записи-открытия файлов в Linux в приложении C/C++ таким образом, чтобы, если приложение было убито, открытые файлы были удалены?

Приложение может быть убито SIGKILL, поэтому я не могу использовать обработчик сигналов.


person jackhab    schedule 26.01.2014    source источник
comment
Под отброшенными вы имеете в виду удаленные (удаленные) из файловой системы?   -  person Harald    schedule 26.01.2014
comment
Скорее всего, не в самом процессе. Важно ли, чтобы файлы при записи уже имели правильное имя. Если нет, вы можете написать их с временным именем. Если процесс доживет до close(), тогда переименуйте файл. То, как вы избавитесь от временных файлов, если процесс будет убит, зависит от того, насколько срочно вы хотите это сделать: регулярная очистка cron, родительский процесс, который замечает, что подпроцесс мертв, и очищает его после этого.   -  person Harald    schedule 26.01.2014


Ответы (1)


Типичный прием для временных файлов — открыть/создать файл, а затем разъединить его, не закрывая файловый дескриптор.

Вы получаете файловый дескриптор файла, которого больше не существует. Вы по-прежнему можете читать из него и писать в него, но как только вы закроете файловый дескриптор (или будете уничтожены), файл будет удален, а занимаемое им место освободится.

Конечно, это не сработает, если вы решите сохранить файл впоследствии.

person Kristof Provost    schedule 26.01.2014
comment
Нельзя ли использовать link("/proc/self/fd/n", "permanent-name");, если нужно сохранить файл? - person Ben Voigt; 26.01.2014
comment
@BenVoigt Обычно эта ссылка (незаконно) пересекает границы файловой системы. Это частный случай? - person Jonas Schäfer; 26.01.2014
comment
@Jonas: После дальнейших исследований, по-видимому, нет. proc/./fd - это особые случаи, это символические ссылки, которые не ломаются при удалении цели. Но link недостаточно умен, чтобы повторно связать цель. Может быть, есть какая-то другая функция, которая есть? - person Ben Voigt; 26.01.2014
comment
@Jonas: На самом деле, этот вопрос дает ответ. linkat с флагом AT_FDCWD и AT_EMPTY_PATH. См. также comments.gmane.org/gmane.linux.file-systems/76553< /а> - person Ben Voigt; 26.01.2014
comment
К сожалению, я не могу найти какой-либо вспомогательный материал на своих страницах руководства. Но да, я увидел ответ только после комментирования здесь! - person Jonas Schäfer; 26.01.2014