Я работаю над менеджером квот, реализованным в C / C ++ под OS X, который ограничивает максимальный размер определенной папки. В моем проекте есть общие рабочие потоки, которые могут выполнять либо запись новых данных в папку, либо перемещение данных из папки на сервер.
Таким образом, иногда задача удаления может удалить файл, который все еще находится в процессе записи на диск другим потоком.
Могу ли я как-то предотвратить удаление файла во время записи. Я могу реализовать собственный механизм (используя флаги, блокировки и т. Д.), Но я считаю, что это должно быть свойством файловой системы.
Я попробовал следующий код, чтобы проверить, удаляет ли удалить файл все еще открыт, но на самом деле это успешно.
#include <stdio.h>
int main() {
FILE *fp;
fp=fopen("./x", "w");
fprintf(fp, "Testing...\n");
if( remove( "./x" ) != 0 )
perror( "Error deleting file" );
else
puts( "File successfully deleted" );
return 0;
}
как я могу закрыть файл перед удалением?
Использовать lsof
Команда, чтобы проверить, какие файлы открыты. (lsof — список открытых файлов)
Например, вы можете вызвать lsof с -F p, и он выведет pid процессов с префиксом ‘p’:
$ lsof -F p /some/file
p1234
p4567
См .: lsof man page
Вы можете использовать chattr (см .: https://en.wikipedia.org/wiki/Chattr) от предотвращения удаления файла. Прочитайте свойство «Неизменный».