Журнал LinuxFormat - перейти на главную

LXF73:Вскрываем ядро

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
(Новая: == Вскрываем ЯДРО == ''Знаток ядра '''Грег Кроа-Хартман''' (Greg Kroah-Hartman) заглянул внутрь последнего ядра, что...)
 
(«Продвинутые» особенности ядра)
Строка 31: Строка 31:
 
=== «Продвинутые» особенности ядра ===
 
=== «Продвинутые» особенности ядра ===
 
''Каждому из нас следует уделить немного времени, чтобы лучше познакомиться с ядром. Последняя версия содержит ряд замечательных дополнений, которые будут полезны всем категориям пользователей.''
 
''Каждому из нас следует уделить немного времени, чтобы лучше познакомиться с ядром. Последняя версия содержит ряд замечательных дополнений, которые будут полезны всем категориям пользователей.''
 +
 +
Ядро 2.6.13 было выпущено 28 августа 2005 года. В него было добавлено около
 +
200 000 новых строк кода, и столько же
 +
строк было модифицировано. большинство
 +
изменений направлено на исправление
 +
ошибок и повышение стабильности;
 +
но 2.6.13 также содержит несколько новых
 +
и интересных функций, которые могут сделать использование ПК под управлением
 +
Linux заметно лучше, причем для каждого.
 +
 +
==== для разработчиков ====
 +
; Inotify
 +
для такой простой концепции (позволить пользователю знать обо всех изменениях, которые выполняются в файлах),
 +
Inotify было уделено достаточно большое
 +
внимание. Все сводится к одному инструменту – Beagle. Beagle – это приложение
 +
Gnome, которое позволяет вам искать на
 +
вашем компьютере практически всё – независимо от
 +
типа файла, в любом месте
 +
вашей системы. С Beagle вы
 +
можете легко находить документы, письма, историю браузера, диалоги IRC и многое
 +
другое (см. http://beaglewiki.org).
 +
 +
если говорить об инструментах, подобных Beagle, то
 +
чтобы они работали эффективно и знали, какие изменения произошли
 +
на вашем Пк в последнее время, им нужен
 +
некоторый метод получения информации
 +
обизменениях в системе, альтернативный
 +
сканированию всего жесткого диск каждый
 +
раз, когда вы выполняете поиск. Inotify –
 +
это часть ядра, которая предоставляет эту
 +
функциональность для пользовательских
 +
запросов. Прежние версии ядер имели
 +
механизм, называемый Dnotify, но он был
 +
неуклюж и работал недостаточно хорошо.
 +
Inotify решает все проблемы, присущие
 +
Dnotify, и позволяет наблюдать за отдельными файлами наряду с целыми деревьями каталогов.
 +
 +
; Kexec и Kdump
 +
Функции Kexec и Kdump уже продолжительное время включаются в ядра дистрибутивов, но только сейчас они нашли место в
 +
основной ветви ядра. Kexec позволяет пользователям загружать и запускать другое
 +
ядро Linux, не требуя перезагрузки работающего ядра в BIOS – благодаря этому экономится много времени при рестарте.
 +
Kdump использует эту особенность, чтобы
 +
снимать дампы ядра системы в случае краха, позволяя разработчикам потом проводить анализ системы.
 +
 +
Пользователи, которые хотят минимизировать перерыв в работе при обновлении
 +
ядра (никто не хочет ждать и изучать сообщения BIOS о повторной проверке шины
 +
SCSI) могут использовать Kexec, чтобы
 +
свести время простоя к минимуму.
 +
 +
==== для пользователей ====
 +
; bind и unbind
 +
Чтобы работать в Linux, устройство должно
 +
иметь драйвер, который будет им управлять.
 +
Ядро выбирает, какое устройство с каким
 +
драйвером нужно связать, с помощью ряда
 +
таблиц, которые отдельные драйверы регистрируют в ядре. до сегодняшнего дня пользователи вообще не могли управлять этими
 +
соответствиями между устройствами и
 +
драйверами, за исключением случая
 +
выгрузки драйвера, что означает освобождение всех устройств, управляемых этим
 +
драйвером.
 +
 +
Версия 2.6.13 дает пользователю возможность связывать (bind) отдельные
 +
устройства с определенным драйвером
 +
и освобождать (unbind) их. Это позволяет
 +
администраторам больших систем блокировать отдельные устройства, загрузить
 +
новый драйвер и затем связать его с этим
 +
устройством, без отсоединения других устройств, которые управляются первоначальным драйвером. Просто представьте себе
 +
всю суету, присущую обновлению большой
 +
дисковой системы, и вы поймете, что это
 +
Вещь с большой буквы.
 +
 +
; Devfs мертва
 +
Файловая система devfs отключена с версии
 +
2.6.13. Это было сделано для того, чтобы
 +
перед полным удалением devfs дать пользователям, которые все еще используют ее,
 +
некоторый “переходный период”. Тем, кто
 +
до сих пор использует devfs, следует перейти на udev. Может показаться странным, что
 +
мы считаем удаление старой неиспользуемой системы шагом вперед, однако правда
 +
заключается в том, что devfs довольно
 +
отвратительна. Она чрезвычайно раздута,
 +
затрудняет чтение кода ядра, и чем раньше
 +
мы от нее избавимся, тем лучше.
 +
 +
; Улучшенные очереди ввода-вывода
 +
Планировщик ввода-вывода, реализующий
 +
алгоритм “Completely Fair Queuing” (полностью справедливая очередь) и являющийся,
 +
возможно, лучшим на сегодняшний день,
 +
был усовершенствован, чтобы обеспечить
 +
более эффективное управление интервалами времени (timeslices). Также в этой области были добавлены два новых системных
 +
вызова, позволяющие пользовательским
 +
программам изменять приоритеты ввода-вывода различных процессов в системе.
 +
Это позволит администраторам более легко
 +
подстраивать производительность различных программ.
 +
 +
==== для встроенных систем ====
 +
; Xtensa
 +
В ядро 2.6.13 была добавлена полностью
 +
новая архитектура ЦПУ: Xtensa. Xtensa – это
 +
встраиваемый 32-битный процессор, который может быть размещен в SoC-системах
 +
с широким спектром встроенных функций –
 +
телефоны, PDA, TV-приемники (set-top
 +
boxes), MP3-плееры, и прочие подобные
 +
устройства.
 +
 +
С этой новой архитектурой Linux теперь
 +
поддерживает 24 основных типа процессоров, и еще большее число подтипов.
 +
Хорошая новость для встроенных устройств.
 +
На заметку тем, кто любит хвастаться –
 +
Linux поддерживает больше различных процессоров, чем любая другая операционная
 +
система (пожалуй, NetBSD может составить
 +
ему конкуренцию в этой области, – прим.
 +
ред.). добавьте этот факт к тому, что Linux
 +
поддерживает больше внешних устройств,
 +
чем любая другая ОС, и станет понятно,
 +
почему Linux считается наиболее гибким и
 +
мощным ядром.
 +
 +
; Выполнить «на месте»
 +
Файловая система ext2 теперь позволяет
 +
программам исполняться «на месте» (inplace)
 +
вместо предварительной загрузки в
 +
оперативную память. Это очень полезно на
 +
встроенных системах, которые имеют ограниченный объем ОЗУ, но большой объем
 +
ПЗУ или Flash-памяти – таких как мобильные телефоны.
 +
 +
; Регулируемая частота
 +
Мы установили частоту прерываний ядра
 +
2.6 на уровне 1000 Гц, что порождало некоторые жалобы от пользователей. Теперь
 +
эта частота может быть установлена на этапе компиляции в три различных значения, в
 +
зависимости от того, как именно будет
 +
использоваться компьютер:
 +
* 100 Гц. Это лучшее решение для маломощных устройств.
 +
* 200 Гц. Идеально для серверов.
 +
* 1000 Гц. Оптимально для настольных систем, или других систем, требующих быстрой, интерактивной реакции на события.
 +
 +
; «Добровольно-вытесняющая» многозадачность
 +
Те пользователи, кто чувствовал себя некомфортно с ядром, реализующим вытесняющую многозадачность (full pre-emption),
 +
теперь получили другую опцию: «добровольно-вытесняющую» многозадачность
 +
(voluntary pre-emption). Она позволяет ядру
 +
прерывать процессы в ряде известных
 +
«точек явного прерывания» (explicit preemption
 +
points), которые выбираются таким
 +
образом, чтобы уменьшить латентность
 +
перепланировки различных программ.
 +
Приложения получают более низкое время
 +
отклика, хотя это достигается за счет некоторого снижения производительности.
 +
 +
{{Врезка|center|
 +
|Заголовок=а что Же 2.6.14 ?
 +
|Содержание=Последняя версия ядра – 2.6.14, выпущенная в конце октября этого
 +
года, содержит ряд интересных функций, как то:
 +
*; relayfs
 +
Временами разработчикам ядра нужно получить от Linux большое
 +
количество данных очень быстро и с минимальными побочными
 +
эффектами. Например, когда вы пытаетесь отладить ядро, вам не
 +
нужно, чтобы внесенные изменения изменяли время выполнения
 +
(timing) отлаживаемого кода.
 +
 +
Relayfs была разработана, чтобы решить эту проблему, и ряд
 +
внешних проектов пользуется ею в течение продолжительного времени, чтобы по возможности решить проблемы передачи данных.
 +
Один из них – Linux Trace Toolkit, и теперь, когда эта функция
 +
добавлена в основное дерево ядра, LTT станет немного ближе к
 +
признанию.
 +
*; Драйвера ipw2100 и ipw2200
 +
Похоже, что почти каждый второй новый ноутбук, производимый в
 +
эти дни, использует чипсет Centrino для поддержки беспроводных
 +
технологий. Основное дерево ядра теперь поддерживает эти
 +
устройства, не вынуждая пользователя копаться на
 +
сайте SourceForge, скачивать какие-то исходные
 +
файлы и разбираться, как собрать и загрузить
 +
драйвер ядра лишь для того, чтобы добиться правильной работы своего ноутбука. С включением в
 +
ядро этих двух драйверов и сопутствующей им
 +
общей инфраструктуры, в основное дерево ядра
 +
теперь станет легче добавлять новые драйверы беспроводных устройств.
 +
*; Сетевой протокол DCCP
 +
Несмотря на то, что Linux уже поддерживает достаточное
 +
количество сетевых протоколов, в него был добавлен еще
 +
один. Этот протокол настолько новый, что 2.6.14 – это первое
 +
ядро, которое действительно будет использоваться для его
 +
тестирования в реальных условиях. DCCP расшифровывается
 +
как Datagram Congestion Control Protocol – протокол управления
 +
массивами датаграмм, и он во многом похож на существующий
 +
протокол UDP, но имеет несколько важных отличий. Подробности о
 +
нем смотрите на странице http://www.icir.org/kohler/dcp/draft-ietfdccp-spec-11.txt.
 +
*; Удаление базы данных идентификаторов PCI
 +
В предыдущих выпусках каждое ядро содержало список строк, описывающих все возможные устройства PCI, которые существуют в
 +
мире. Это делалось лишь для того, чтобы некоторые файлы в директории /proc выглядели красиво, но эта красота отнимала много
 +
места. Этот файл был удален, так что память ядра, которую он
 +
занимал, теперь можно использовать с большей пользой. для тех
 +
пользователей, кто действительно хочет иметь красивые имена, эта
 +
таблица доступна через lspci.
 +
*; Система защиты жесткого диска для ThinkPad
 +
Новые ноутбуки ThinkPad от IBM/Lenovo содержат детектор малых
 +
перемещений, который может определить, когда ноутбук соскользнет со стола и близок к тому, чтобы упасть на землю. если устройство обнаружит, что ноутбук падает, оно быстро выключает
 +
диск, чтобы помочь предотвратить любые неприятности, связанные с потерей данных.
 +
 +
Linux теперь поддерживает эту замечательную функцию в
 +
своем новом драйвере. Но программисты ядра не
 +
были бы самими собой, если
 +
бы не добавили
 +
несколько новых возможностей, которых нет ни в какой другой операционной системе. Оказалось, что устройство, которое выполняет
 +
эти измерения, может использоваться для определения угла, на
 +
который отклонился ноутбук. Значит, устройство можно связать с
 +
курсором мыши таким образом, что держа ноутбук в руках и наклоняя его из стороны в сторону, вы будете перемещать курсор в различных направлениях.
 +
 +
когда первоначальная эйфория от этой функции поутихла, стало
 +
понятно, что следует просто экспортировать информацию о наклоне
 +
в пространство пользователя, чтобы любая программа могла получить к ней доступ. Это породило целый ряд небольших программ,
 +
которые показывали в окне вращение ноутбука в режиме реального
 +
времени, в соответствии с тем, как его держали. будем надеяться,
 +
что в ближайшие дни появится и что-нибудь полезное, использующее эту функцию.
 +
*; FUSE
 +
Наконец, теперь возможно создавать файловую систему в пространстве пользователя, используя любой язык программирования
 +
на ваш вкус (кто-нибудь хочет сделать это на Python?). Fuse позволяет экспортировать внутреннюю виртуальную файловую систему
 +
ядра в пространство пользователя, чтобы каждый мог работать с
 +
ней. С использованием Fuse уже написан ряд файловых систем,
 +
работающих в пользовательском пространстве, включая системы
 +
SSH и tar. Посетите основную страницу разработки Fuse
 +
http://fuse.sourceforge.net
 +
 +
как и в случае со всеми новыми функциями, предоставляемыми
 +
очередными версиями ядра, вам нужно активировать эту функцию
 +
и пересобрать ваше ядро, чтобы все работало как нужно. Получить
 +
дополнительную информацию о компиляции, установке и загрузке
 +
нового ядра вы сможете на странице с прекрасным руководством
 +
HOWTO по сборке ядра:
 +
http://www.digitalherait.com/linux/Kernel-Build-hOWTO.html.
 +
|Ширина=}}
  
 
=== Начнем, пожалуй ===
 
=== Начнем, пожалуй ===

Версия 19:47, 17 января 2009

Содержание

Вскрываем ЯДРО

Знаток ядра Грег Кроа-Хартман (Greg Kroah-Hartman) заглянул внутрь последнего ядра, чтобы показать вам, что заставит ваш ПК работать на полную мощность.

«С технической точки зрения, я верю, что ядро будет сохранять те же черты, а всё действительно интересное будут происходить в пространстве пользователя» Линус Торвальдс (Linux Torvalds), 2001 год.

Несмотря на то, о что думает доброжелательный «хранитель сообщества», ядро Linux демонстрирует, что оно является очень интересной и важной частью системы. На самом нижнем уровне, ядро отвечает за нормальную работу аппаратного обеспечения (того, на что вы, обычно, тратите много денег). Это позволяет вам запускать ваш любимый web-браузер, клиент электронной почты, программу IRC, трехмерную «стрелялку» и т.д., одновременно. Без него не было бы Linux.

С появлением ядер серии 2.6 в конце 2003 года, разработчики ядра предоставили миру предельно стабильную, поддерживающую многопроцессорность операционную систему, работающую быстрее любой другой ОС на широком спектре типов процессоров. Какая еще операционная система может масштабироваться для использования что в крохотном MP3-плеере или встроенном в робота контроллере, что в крупнейших суперкомпьютерах (некоторые с более чем 512 процессорами)? Все это возможно только благодаря самому ядру: остальные компоненты, работающие на более высоких уровнях – лишь надстройки над ним.

«Продвинутые» особенности ядра

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

Ядро 2.6.13 было выпущено 28 августа 2005 года. В него было добавлено около 200 000 новых строк кода, и столько же строк было модифицировано. большинство изменений направлено на исправление ошибок и повышение стабильности; но 2.6.13 также содержит несколько новых и интересных функций, которые могут сделать использование ПК под управлением Linux заметно лучше, причем для каждого.

для разработчиков

Inotify

для такой простой концепции (позволить пользователю знать обо всех изменениях, которые выполняются в файлах), Inotify было уделено достаточно большое внимание. Все сводится к одному инструменту – Beagle. Beagle – это приложение Gnome, которое позволяет вам искать на вашем компьютере практически всё – независимо от типа файла, в любом месте вашей системы. С Beagle вы можете легко находить документы, письма, историю браузера, диалоги IRC и многое другое (см. http://beaglewiki.org).

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

Kexec и Kdump

Функции Kexec и Kdump уже продолжительное время включаются в ядра дистрибутивов, но только сейчас они нашли место в основной ветви ядра. Kexec позволяет пользователям загружать и запускать другое ядро Linux, не требуя перезагрузки работающего ядра в BIOS – благодаря этому экономится много времени при рестарте. Kdump использует эту особенность, чтобы снимать дампы ядра системы в случае краха, позволяя разработчикам потом проводить анализ системы.

Пользователи, которые хотят минимизировать перерыв в работе при обновлении ядра (никто не хочет ждать и изучать сообщения BIOS о повторной проверке шины SCSI) могут использовать Kexec, чтобы свести время простоя к минимуму.

для пользователей

bind и unbind

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

Версия 2.6.13 дает пользователю возможность связывать (bind) отдельные устройства с определенным драйвером и освобождать (unbind) их. Это позволяет администраторам больших систем блокировать отдельные устройства, загрузить новый драйвер и затем связать его с этим устройством, без отсоединения других устройств, которые управляются первоначальным драйвером. Просто представьте себе всю суету, присущую обновлению большой дисковой системы, и вы поймете, что это Вещь с большой буквы.

Devfs мертва

Файловая система devfs отключена с версии 2.6.13. Это было сделано для того, чтобы перед полным удалением devfs дать пользователям, которые все еще используют ее, некоторый “переходный период”. Тем, кто до сих пор использует devfs, следует перейти на udev. Может показаться странным, что мы считаем удаление старой неиспользуемой системы шагом вперед, однако правда заключается в том, что devfs довольно отвратительна. Она чрезвычайно раздута, затрудняет чтение кода ядра, и чем раньше мы от нее избавимся, тем лучше.

Улучшенные очереди ввода-вывода

Планировщик ввода-вывода, реализующий алгоритм “Completely Fair Queuing” (полностью справедливая очередь) и являющийся, возможно, лучшим на сегодняшний день, был усовершенствован, чтобы обеспечить более эффективное управление интервалами времени (timeslices). Также в этой области были добавлены два новых системных вызова, позволяющие пользовательским программам изменять приоритеты ввода-вывода различных процессов в системе. Это позволит администраторам более легко подстраивать производительность различных программ.

для встроенных систем

Xtensa

В ядро 2.6.13 была добавлена полностью новая архитектура ЦПУ: Xtensa. Xtensa – это встраиваемый 32-битный процессор, который может быть размещен в SoC-системах с широким спектром встроенных функций – телефоны, PDA, TV-приемники (set-top boxes), MP3-плееры, и прочие подобные устройства.

С этой новой архитектурой Linux теперь поддерживает 24 основных типа процессоров, и еще большее число подтипов. Хорошая новость для встроенных устройств. На заметку тем, кто любит хвастаться – Linux поддерживает больше различных процессоров, чем любая другая операционная система (пожалуй, NetBSD может составить ему конкуренцию в этой области, – прим. ред.). добавьте этот факт к тому, что Linux поддерживает больше внешних устройств, чем любая другая ОС, и станет понятно, почему Linux считается наиболее гибким и мощным ядром.

Выполнить «на месте»

Файловая система ext2 теперь позволяет программам исполняться «на месте» (inplace) вместо предварительной загрузки в оперативную память. Это очень полезно на встроенных системах, которые имеют ограниченный объем ОЗУ, но большой объем ПЗУ или Flash-памяти – таких как мобильные телефоны.

Регулируемая частота

Мы установили частоту прерываний ядра 2.6 на уровне 1000 Гц, что порождало некоторые жалобы от пользователей. Теперь эта частота может быть установлена на этапе компиляции в три различных значения, в зависимости от того, как именно будет использоваться компьютер:

  • 100 Гц. Это лучшее решение для маломощных устройств.
  • 200 Гц. Идеально для серверов.
  • 1000 Гц. Оптимально для настольных систем, или других систем, требующих быстрой, интерактивной реакции на события.
«Добровольно-вытесняющая» многозадачность

Те пользователи, кто чувствовал себя некомфортно с ядром, реализующим вытесняющую многозадачность (full pre-emption), теперь получили другую опцию: «добровольно-вытесняющую» многозадачность (voluntary pre-emption). Она позволяет ядру прерывать процессы в ряде известных «точек явного прерывания» (explicit preemption points), которые выбираются таким образом, чтобы уменьшить латентность перепланировки различных программ. Приложения получают более низкое время отклика, хотя это достигается за счет некоторого снижения производительности.


Начнем, пожалуй

Вашим программистским пальцам не терпится начать? Углубимся в новое ядро и рассмотрим две самые замечательные функции.

Итак, мы охватили множество интересных теоретических вопросов – и вы, вероятно, ждете практических способов, как можно начать использовать эти новые возможности ядра прямо сейчас.

Ну что ж, начнем: если вы хотя бы в общих чертах разбираетесь в языке C, вы можете «сразиться» с Inotify, изучив новые функции ядра для добавления и удаления точек слежения (watches) за файлами.

Если же вы не настолько бесстрашны, читайте врезку «Привязка драйверов вручную», чтобы узнать, как можно настроить драйвер, чтобы он автоматически подгружался при подключении устройств типа USB Flash.


Внутри Inotify

Функция Inotify добавляет три новых системных вызова:

int inotify_init(void);
int inotify_add_watch(int fd, const char
*path, __u32 mask);
int inotify_rm_watch(int fd, __u32 mask);

Выступая как замена для Dnotify, Inotify работает с сущностями, называемыми точками слежения (watch). Watch – это пара «объект-маска», которая описывает событие, о наступлении которого пользователь хотел бы получать уведомления. Объект – это файл или каталог (представлен дескриптором открытого файла), а маска – битовое описание событий. Р азличные типы событий, которые можно отслеживать, приведены ниже:

  • IN_ACCESS: к файлу был доступ;
  • IN_MODIFY: файл был изменен;
  • IN_ATTRIB: были изменены метаданные файла;
  • IN_CLOSE_WRITE: файл был закрыт с записью всех изменений;
  • IN_CLOSE_NOWRITE: файл был закрыт без записи изменений;
  • IN_OPEN: файл был открыт;
  • IN_MOVED_FROM: файл был перемещен из положения X;
  • IN_MOVED_TO: файл был перемещен в положение Y;
  • IN_CREATE: файл в каталоге был создан;
  • IN_DELETE: файл в каталоге был удален;
  • IN_DELETE_SELF: объект наблюдения был удален.

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

Чтобы создать точку слежения и зарегистрировать ее в ядре, нужно получить дескриптор с помощью вызова функции inotify_init(), например, так:

int fd = inotify_init();

Затем, используя этот новый файловый дескриптор, вы можете добавить watch к нему, используя функцию inotify_add_watch():

int wd = inotify_add_watch(fd, path, mask);

где fd – дескриптор, возвращенный функцией inotify_init(); path – путь к файлу или каталогу, за которым вы хотели бы наблюдать; и mask – тип события, которое вы будете отслеживать.

Функция inotify_add_watch() возвращает указатель на дескриптор watch, который должен быть сохранен, чтобы правильно выполнить очистку.

Чтобы удалить точку слежения, которая уже создана, используйте функцию inotify_rm_watch():

int retval = inotify_rm_watch(fd, wd);

где fd – первоначальный файловый дескриптор, возвращенный inotify_init(), и wd – дескриптор watch, возвращенный при вызове inotify_add_watch().

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

Структура данных, которые могут быть получены от ядра, описывается следующим кодом на C:

struct inotify_event {
__s32 wd; /* дескриптор точки слежения */
__u32 mask; /* маска */
__u32 cookie; /* cookie для синхронизации событий */
__u32 len; /* длинна имени (с завершающим нулем) */
char name[0]; /* место для размещения имени */
};

Названия полей говорят сами за себя, за исключением поля cookie. если это поле имеет ненулевое значение, это значит, что для данного объекта возникло несколько событий одновременно. В качестве примера можно привести переименование файла. если мы будем наблюдать за каталогом, в котором будет переименован файл (mv foo baz), произойдут два события: IN_MOVE_FROM и IN_MOVE_TO. Оба они будут иметь одинаковое значение cookie, что позволит пользовательской программе скоординировать эти события.

Файловый дескриптор, возвращаемый inotify_init(), позволяет использовать вызовы select() и poll(), так что блокирующий вызов read() не является необходимым.

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

В качестве очень простого примера программы, который показывает, как регистрировать события и читать их по мере наступления, посмотрите пакет inotify-utils, который можно найти на странице http://www.kernel.org/pub/linux/kernel/people/rml/inotify/utils.

Поиски стабильности

Лоскутные заплатки, «горячие» исправления, два дерева становятся одним… Как процесс разработки ядра изменился в лучшую сторону за последние пять лет.

Взгляд в будущее

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

Персональные инструменты
купить
подписаться
Яндекс.Метрика