Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19

Удаление файла в который ведется запись

08.01.2013, 00:24. Показов 2124. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется програмка, которая ведеть свой лог и записывает его в файл, запись ведется непрерывно. Все нормально записывается, команда tail работает с таким файлов великолепно.
Заметил нехорошую особенность. Если я в процессе работы с программой удаляю этот файл, например из командной строки то моя программа даже не замечает этого. Она просто перестает в него писать.
Подскажите имеется какаялибо возможность проверки удачности записи.
Для записи использую std::wofstream.
Пробовал проверять через методы fail, good. eof Они никак не реагируют. Как вариант может быть открытие файла по новой перед записью, но данный вариант считаю накладным, запись ведется достаточно часто.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2013, 00:24
Ответы с готовыми решениями:

Запись и удаление из файла
Здравствуйте, у меня есть файл. Записываются данные туда так var homes = ini.GetSetting("HomeNames", id, home); var n =...

Запись/Удаление строки из файла
Помогите с записью строки в файл, вообще если что задание написать "Телефонный справочник" в каждой строке которого должно быть две...

Запись в файл, считывание с файла, поиск и удаление
Помогите пожалуйста сделать программу. Должна идти запись в файл, считывание с файла, поиск и удаление. using System; using...

11
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
08.01.2013, 13:10
Цитата Сообщение от abutorin Посмотреть сообщение
Заметил нехорошую особенность. Если я в процессе работы с программой удаляю этот файл, например из командной строки то моя программа даже не замечает этого. Она просто перестает в него писать.
Это не так. Грубо говоря удаление открытого в данный момент файла = удалению записи о нем в каталоге, т.е. никто больше не сможет отрыть файл, подробности например в man unlink.
Традиционный путь - после удаления файла просигналить процессу который пишет в файл о необходимости переоткрыть его.
Другой вариант - отслеживать изменения в ФС man inotify
Цитата Сообщение от abutorin Посмотреть сообщение
Как вариант может быть открытие файла по новой перед записью, но данный вариант считаю накладным, запись ведется достаточно часто.
Как вариант можно делать перед записью stat() и если вернули ENOENT создавать файл заново, думаю это чуть легче чем создать/открыть+записать+закрыть.
1
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
08.01.2013, 13:36  [ТС]
g_u_e_s_t, спасибо за советы. Посмотрю какой вариант менее накладен и выберу его.
Сейчас мысль родиласьеще одна, могу сделать hardlink на файл лога в нескольких папках. Решение правда не самое красивое но тоже каквариант.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
09.01.2013, 17:29
Цитата Сообщение от abutorin Посмотреть сообщение
Посмотрю какой вариант менее накладен и выберу его.
Однозначно традиционный с ловлей SIGHUP.
Цитата Сообщение от abutorin Посмотреть сообщение
Сейчас мысль родиласьеще одна, могу сделать hardlink на файл лога в нескольких папках.
Вам видней конечно, но со стороны это выглядит как отсрочка "проблемы", а нее решение.
0
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
09.01.2013, 18:04  [ТС]
g_u_e_s_t Я правильно понимаю что если если файл открыт, и в него ведется запись. А из другой программы я беру и переношу его в другое место, то данные будут продолжать писатся в негоже? Существуют ли способы блокировки файла пока в него ведётся запись?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
09.01.2013, 18:22
Цитата Сообщение от abutorin Посмотреть сообщение
Я правильно понимаю что если если файл открыт, и в него ведется запись. А из другой программы я беру и переношу его в другое место, то данные будут продолжать писатся в негоже?
Не понятно как понимать "переношу".
Что бы Вы не делали с именем файла (rename()/unlink()) на уже отрытый дескриптор это не повлияет ни как.
А если "переношу" это copy + unlink + create() то новый файл так и останется пустым, хоть и будет иметь старое имя.
Цитата Сообщение от abutorin Посмотреть сообщение
Существуют ли способы блокировки файла пока в него ведётся запись?
В линуксе (с ограничениями)да, в POSIX нет. man fcntl (обратите внимание на описанные там проблемы)
0
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
09.01.2013, 18:30  [ТС]
Под "переношу" подразумеваю "открываю файловый менеджер и переношу файл из одного каталога в другой". Но как я понимаю устройство ФС в линуксе при "переносе" данные в самом файле никак не меняются и его inode остается прежним, а меняется только данные каталога. Вобщем ваше предложение понял. Спасибо.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
09.01.2013, 18:34
Цитата Сообщение от abutorin Посмотреть сообщение
"открываю файловый менеджер и переношу файл из одного каталога в другой".
Ну если у файлового менеджера есть хоть капля мозгов и оба каталога расположены на одной ФС то это rename()
0
deleted
177 / 50 / 5
Регистрация: 29.03.2013
Сообщений: 365
06.04.2013, 21:33
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Как вариант можно делать перед записью stat() и если вернули ENOENT создавать файл заново
Race condition? В первом процессе stat вернул ENOENT, другой процесс быстренько создаёт файл, первый процесс пытается создать файл, оппа а он уже есть! Или стат говорит что файл есть, открываешь, а его уже нету
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.04.2013, 21:49
Цитата Сообщение от _1_ Посмотреть сообщение
Race condition? В первом процессе stat вернул ENOENT, другой процесс быстренько создаёт файл, первый процесс пытается создать файл, оппа а он уже есть!
Да гонки есть. Но старый хэндл то у нас по прежнему открыт, т.е. можем выругаться и работать дальше не портя чужих данных.
Цитата Сообщение от _1_ Посмотреть сообщение
Или стат говорит что файл есть, открываешь, а его уже нету
не актуально.
0
deleted
177 / 50 / 5
Регистрация: 29.03.2013
Сообщений: 365
07.04.2013, 11:33
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Да гонки есть.
если есть значит надо убрать
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.04.2013, 12:04
Цитата Сообщение от _1_ Посмотреть сообщение
если есть значит надо убрать
ИМХО не реально. Был бы рад ошибаться.
Максимум, что на мой взгляд тут можно сделать - ловить и как-то обрабатывать (отказаться работать/создать свой файлнэйм.хххх.лог/...) такую ситуацию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2013, 12:04
Помогаю со студенческими работами здесь

Удаление записи из файла — дублируется последная запись
Всем добрый день. Необходимо написать процедуру для удаления текущей записи из типизированного файла и поместить ее в DLL. Написал такую...

Удаление символов из файла и запись в новый файл.
Задание: Удалить все символы "+" и "-" в самой длинной строке файла. Остальные переписать без изменений. Помогите с ошибкой. program...

Удаление цифр из строк 1 файла и запись в другой
Здравствуйте! Дан файл, компонентами которого являются строки символов. Переписать строки этого файла в другой файл, удалив из каждой...

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

Чтение текста из файла, удаление каждой второй строки (\n), запись в файл
Дана строка у текстовом файле input.txt: Teachers TV's resources Have generated views Teachers TV content is now available On TES...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru