Уявіть два процеси: читач і автор, які спілкуються через звичайний файл на файлі ext3. IN_MODIFY
У файлі Reader є інотифікований годинник. Writer записує 1000 байтів у файл за один write()
виклик. Читач отримує подію ініціювання та викликає fstat
файл. Що бачить Читач?
Чи є гарантія, що Reader отримає принаймні 1000 для
st_size
файлу? З моїх експериментів, схоже, ні.Чи є гарантія, що Reader може насправді
read()
1000 байт?
Це відбувається на серйозно пов'язаному коду вводу / виводу. Наприклад, sar
показує час очікування близько 1 секунди. У моєму випадку "Читач" насправді чекає 10 секунд ПІСЛЯ отримання ініціативної події перед викликом stat
та отримання занадто малих результатів.
Я сподівався, що ініціативна подія не буде доставлена, поки файл не буде готовий. Я підозрюю, що насправді відбувається це те, що ініціативна подія спрацьовує під час write()
виклику в програмі Writer, а дані фактично доступні для інших процесів у системі, коли це стане готовим. У цьому випадку 10-х - це недостатньо часу.
Я думаю, я просто шукаю підтвердження того, що ядро насправді реалізує ініціювати так, як я здогадуюсь. Також, якщо є якісь варіанти, щоб змінити таку поведінку?
Нарешті - який сенс ініціювати, враховуючи таку поведінку? Після отримання події ви все одно обмежуєтесь опитуванням файлу / каталогу, поки дані фактично не стануть доступними. Можна також робити це весь час і забувати про започаткування.
*** EDIT ** * * Добре, як це часто буває, поведінка, яку я бачу, насправді має сенс, тепер, коли я розумію, що я насправді роблю. ^ _ ^
Я реагую на подію IN_CREATE у каталозі, в якому живе файл. Тож я фактично статую (), будучи файлом у відповідь на створення файлу, не обов'язково подія IN_MODIFY, яка може надходити пізніше.
Я збираюся змінити свій код, щоб після отримання події IN_CREATE я підписався на IN_MODIFY на сам файл, і я фактично не намагатимусь прочитати файл, поки не отримаю подію IN_MODIFY. Я усвідомлюю, що там є невелике вікно, в якому я можу пропустити запис у файл, але це прийнятно для моєї програми, оскільки в гіршому випадку файл буде закритий через максимальну кількість секунд.