Читаем Linux API. Исчерпывающее руководство полностью

• Событие IN_IGNORED генерируется при удалении элемента списка наблюдения. Это может произойти по нескольким причинам: приложение использовало вызов inotify_and_watch() для явного удаления элемента, либо элемент был имплицитно удален ядром, так как объект мониторинга был удален, либо файловая система, в которой данный объект находился, была размонтирована. Событие IN_IGNORED не генерируется, когда элемент списка наблюдения с установленным флагом IN_ONESHOT автоматически удаляется после произошедшего события.

• Если субъект события — каталог, то вдобавок к другим битам в поле mask также будет установлен бит IN_ISDIR.

• Событие IN_UNMOUNT информирует приложение, что файловая система, содержавшая наблюдаемый объект, была размонтирована. После этого события будет доставлено следующее событие, содержащее бит IN_IGNORED.

• Флаг IN_Q_OVERFLOW описывается в разделе 19.5, где ведется обсуждение ограничений очереди событий inotify.

Поле cookie используется для объединения связанных друг с другом событий. В настоящее время оно применяется только при переименовании файла. Когда происходит это событие для каталога, содержавшего переименовываемый файл, генерируется событие IN_MOVE_FROM, а затем событие IN_MOVE_TO генерируется для каталога, содержащего переименованный файл. (Если файлу присваивается новое имя в одном и том же каталоге, то оба события происходят с данным каталогом.) В поле cookie этих двух событий будет храниться одно и то же уникальное значение, что позволит приложению связать их.

Если событие происходит с файлом внутри наблюдаемого каталога, то поле name используется для возврата строки, идентифицирующей файл и завершающейся нуль-символом. Если же событие происходит с самим объектом наблюдения, то поле name не применяется, а поле len будет содержать 0.

Поле len показывает, сколько байтов было выделено для поля name. Это поле является обязательным, так как между окончанием строки, сохраненной в поле name и началом следующей структуры inotify_event, содержащейся в буфере, возвращенном функцией read(), может находиться несколько заполняющих байтов (см. рис. 19.2). Длина каждого события inotify, таким образом, может быть вычислена как sizeof(struct notify_event) + len.

Если буфер, переданный функции read(), слишком мал, чтобы вместить еще и следующую структуру inotify_event, то, в целях предупреждения приложения об этом, функция read() завершается с ошибкой EINVAL. (В версиях ядра, предшествовавших версии 2.6.21, функция read() в таком случае возвращала значение 0. Изменение в пользу применения константы EINVAL дает более четкое указание на допущенную программную ошибку.) Приложение может ответить повторной попыткой вызова функции read() с буфером увеличенного размера. Однако этой проблемы можно вовсе избежать, удостоверяясь, что буфер имеет достаточный размер для хранения хотя бы одного события: размер буфера, переданного функции read(), должен быть не менее (sizeof(struct inotify_event) + + NAME_MAX + 1) байт, где NAME_MAX — максимальная длина имени файла плюс один байт для завершающего нуль-символа.

Использование размера буфера, большего, чем минимальный, позволяет приложению эффективно получать информацию о нескольких событиях с помощью лишь одного вызова функции read(). Эта функция из файлового дескриптора inotify возвращает минимальное количество доступных событий и количество событий, которое может поместиться в предоставленный буфер.

Вызов ioctl(fd, FIONREAD, &numbytes) возвращает количество байтов, доступных в настоящий момент для чтения, а также объект inotify, на который ссылается файловый описатель fd.

События, считываемые из файлового дескриптора inotify, формируют собой упорядоченную очередь. Таким образом, например, гарантируется, что при переименовании файла событие IN_MOVED_FROM будет прочитано перед событием IN_MOVED_TO.

При добавлении нового события в конец очереди событий ядро объединит данное событие с событием, находящимся в хвосте очереди (таким образом, фактически получается, что новое в очередь не ставится), если оба этих события имеют одинаковые значения полей wd, mask, cookie и name. Так происходит потому, что многим приложениям нет необходимости знать о повторяющихся экземплярах одного и того же события, а отбрасывание лишних событий уменьшает количество памяти (ядра), необходимой для хранения очереди. Однако это значит, что мы не можем использовать inotify для достоверного определения того, сколько раз или как часто происходило повторяющееся событие.


Пример программы

Несмотря на то что в предшествующем описании много деталей, интерфейс API inotify на самом деле достаточно прост в обращении. В листинге 19.1 показано его применение.


Листинг 19.1. Использование интерфейса API inotify

inotify/demo_inotify.c

#include

#include

#include "tlpi_hdr.h"


static void /* Отобразить информацию из структуры inotify_event*/

displayInotifyEvent(struct inotify_event *i)

{

printf(" wd =%2d; ", i->wd);

if (i->cookie > 0)

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных