ofstream - определить, был ли файл удален между открытием и закрытием - PullRequest
4 голосов
/ 04 февраля 2010

Я пишу логгер в linux.
регистратор открывает файл при инициализации.
и записывает в этот дескриптор файла при запуске программы.
если файл журнала будет удален после файладескриптор создан,
исключение / ошибка не будет обнаружена.
я пробовал:

out.fail()
!out.is_open()

У меня есть Google, и я нашел этот пост.
http://www.daniweb.com/forums/thread23244.html

так что теперь я понимаю, что даже если файл был удален с помощью команды rm.он все еще существует, он просто не был связан.
каков наилучший способ справиться с этим?
1. это приложение журнала, поэтому проблема производительности, я не хочу использовать stat () на каждомнапишите
2. мне все равно, если некоторые строки в файлах журналов будут отсутствовать при запуске
3. пользователю разрешено удалить файл журнала, чтобы начать все сначала. регистратор должен снова открытьфайл.

Ответы [ 3 ]

6 голосов
/ 04 февраля 2010

Файлы ' не связаны ' с rm.

Файл может иметь много имен. Если у него не осталось имен, и никто не открыл его, то файловая система освобождает его, и занимаемое им пространство можно использовать повторно.

В Linux есть API для «просмотра» файлов, который называется inotify, но это создает сложности и условия гонки.

Итак, главный вопрос в том, кто еще удаляет этот файл при запуске и почему? Убедить их не делать!

1 голос
/ 04 февраля 2010

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

Традиционный механизм UNIX для этого состоит в том, чтобы ваша программа установила обработчик сигнала (часто для SIGHUP, поскольку в противном случае для демона это не имеет смысла).Обработчик сигнала содержит код для закрытия программы и повторного открытия файла журнала.

Затем пользователю сообщают, что после удаления файла журнала ему необходимо отправить SIGHUP программе.

0 голосов
/ 04 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...