LINUX.ORG.RU

inotify IN_MODIFY отваливается watch_fd

 ,


0

2

Добрый день,

Использую inotify для того, чтобы следить за изменениями файла /etc/passwd. Но так выходит, что после получения события изменения, события не приходят. Пришел к некоторой мысли, что файл(нода) как то изменяется, что watch file descriptor слетает и приходится отписывать старый watch_fd и подписываться заново. Тогда работает.

Подписываюсь я так

int watch_fd = inotify_add_watch(fd_, files_to_watch_[i].c_str(), IN_MODIFY);

inotify_init() инциализирую без доп. параметров.

Верно ли я понимаю, что действительно нужно переподписываться или же есть другие варианты. И если других вариантов нет, то стоит ли отписывать inotify_rm_watch() старый дескриптор или он сам ядром убирается?

IN_MODIFY — это изменения файла. Нормальный текстовый редактор будет перезаписывать файл, создавая новый временный файл, а затем делать rename. Поэтому стоит подписаться на IN_MOVED_TO для директории, содержащей файл (man 7 inotify)

kawaii_neko ★★★★
()
Ответ на: комментарий от kawaii_neko

Нормальный текстовый редактор

Не обязательно должен создавать новый и переименовывать, он может держать новый файл в своём спец формате, делать .bak файл и открыть на перезапись исходный. Другое дело, что для /etc/passwd это нежелательно и редакторы потому и обвязываются внешними утилитами типа vipw, которые подсовывают редактору уже временную копию.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от xionovermazes

некоторые утилиты этот временный файл вообще могут наверное в /tmp/ где-то делать, не ?

/tmp может быть на другой FS, потому mv будет не атомарна. Для примера vipw подсовывает для vi файл /etc/passwd.edit

vodz ★★★★★
()
Ответ на: комментарий от xionovermazes

Подпишись на все изменения в этой директррии и отследивай, когда там появляется новый passwd - не важно, в результате переименования или создания

mittorn ★★★★★
()
Ответ на: комментарий от LamerOk

Обязательно.

Сами придумали. Как раз нормальный редактор обязан работать с исходным файлом при записи, тем самым это гарантирует вероятность что оставшегося объёма на диске хватит и вы не потеряете свою работу по редактированию и сохраняться моды доступа, а те файлы, которые не могут временно содержать не полную информацию как passwd оборачиваются вызовом редактора с копией. Перед тем как тупо спорить желательно ознакомиться с мат частью.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от vodz

Обязательно.

Сами придумали.

Спасибо за комплимент, но нет - задолго до меня.

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

Докажите.

Перед тем как тупо спорить желательно ознакомиться с мат частью.

Пафос выглядит неплохо, когда вы сообщаете окружающим, что 2+2 = 4. А когда у вас 2+2 = 5, выходит довольно комично.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Пафос выглядит неплохо

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

vodz ★★★★★
()
Ответ на: комментарий от vodz

Какая жалость. Я так надеялся увидеть алгоритм записи в N блоков файловой системы N+M блоков данных(, где N и M - целые положительные числа). Такое-то открытие осталось закрытым.

LamerOk ★★★★★
()
Ответ на: комментарий от vodz

Если так делать то после аварийного перезапуска хоста во время редактирования файла вы получите битый файл. Либо пустой либо не дописанный до конца.

При переименовании такая проблема исключена.

anonymous
()
Ответ на: комментарий от anonymous

При перезапуске посредине редактирования ничего страшного не происходит, непосредственная запись файла в памяти возможно для простейших редакторов для небольших файлов, ибо вставка одного символа в начало большого будет неудобно долго, потому временный файл у редакторов делается в его спец формате для быстрой работы. Вопрос лишь в том, допускает ли редактор сохранение файла, если файл позволяет его переписать, а каталог - не позволяет в нём создать другой файл. Ну так вот, я видел за свою жизнь разный подход, потому и написал «необязательно».

vodz ★★★★★
()
Ответ на: комментарий от vodz

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

anonymous
()
Ответ на: комментарий от anonymous

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

vodz ★★★★★
()
Ответ на: комментарий от vodz

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

anonymous
()
Ответ на: комментарий от anonymous

Это же ваши слова.

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

vodz ★★★★★
()
Ответ на: комментарий от anonymous

Своё дело для редактора это сохранить файл, это как раз его дело.

Ну вот по вашей методике его сохранить и не удастся, пока вы будете лихорадочно выбирать альтернативное место для сохранения, чертыхаясь на то, что файл то на самом деле вам доступен для записи, произойдёт перезагрузка, вы же этого хотели :) В результате кеш не сбросится на диск и не будет ни оригинального имени, так как вы его переименуете в .bak ни правильного результата редактирования. Кто вам обещал перезагрузку с сохранением кеша как файла так и текущего каталога? Честно говоря этот нудный спор ни о чём уже утомил. Бесконечно долдонить на 3 реально существующих метода, что только один самый «правильный» — тупой детский сад, всё время забываю что тут на ЛОРе так принято...

vodz ★★★★★
()
Ответ на: комментарий от vodz

В результате кеш не сбросится на диск и не будет ни оригинального имени, так как вы его переименуете в .bak ни правильного результата редактирования.

Отредактированная версия сохраняется, например, в .tmp. А потом, как выше уже заметили, происходит атомарный rename .tmp в оригинальный файл. Таким образом, на диске останется или старая версия или появится новая. Даже если останется только старая - не беда, т.к. хороший редактор (например, vim) ведёт лог и при загрузке файла сообщит, что файл старый, но можно восстановить последние изменения.

gag ★★★★★
()
Ответ на: комментарий от gag

А потом, как выше уже заметили, происходит атомарный rename .tmp в оригинальный файл.

Я прекрасно помню что я тут написал.

Таким образом, на диске останется или старая версия или появится новая.

Зачем влезать в спор не вникая что тут написано?

vodz ★★★★★
()