Термин реальное время употребляется здесь неправильно, поскольку это расширение не делает попыток обеспечить гарантии времени задержки при доставке сигнала. Однако средства, которые оно добавляет, удобны для построения реализаций систем реального времени.
До появления стандарта POSIX приложение могло обращаться к struct sigcontext
за информацией того же рода, что теперь представляет siginfo_t
, и термин "контекст" остался от этой старой реализации.
Этот третий параметр на самом деле указывает на структуру struct ucontext
, которая позволяет процессам выполнять полное переключение контекстов в пользовательском пространстве. Данные вопросы выходят за пределы тем, рассматриваемых в настоящей книге, но это хорошо документировано в Single Unix Specification.
Существует гораздо больше значений si_code
, нежели мы обсуждаем здесь, и эти значения имеют отношение к асинхронному вводу-выводу, очередям сообщений и таймерам реального времени, что выходит за границы тем, обсуждаемых в книге.
Он также принимает специальное значение SIGTRAP
, которое используется отладчиками, и SIGPOLL
, применяемое механизмом ненадежного асинхронного ввода-вывода. Ни один из них не описан в настоящей книге, поэтому подробности об этих сигналах не включены в табл. 12.3.
Вспомните, что SIGCHLD
посылается не только при завершении дочернего процесса, но и при его приостановке или возобновлении работы.
Дополнительные примеры обработки сигналов вы можете найти в программах для аренды файлов (глава 13), управления терминалом (глава 16) и работы с интервальными таймерами (глава 18).
Это похоже на тип sigset_t
, используемый для шаблонов сигналов.
Когда сетевой сокет прослушивается ( listen()
) и готов к приему ( accept()
), считается, что он готов к считыванию для целей select()
; информацию о сокетах можно найти в главе 17.
Если сравнить это с параметром numfds
для poll()
, то можно понять, почему возникают затруднения.
Кроме некоторых экспериментальных ядер серии 2.1.
Когда Линус Торвальдс впервые реализовал select()
, неспособность ядра BSD обновлять timeout
была отмечена как ошибка на man-странице для select()
. Вместо написания ошибочного кода Линус решил "исправить" эту ошибку. К сожалению, комитеты по стандартам одобрили поведение BSD.
Фактически ядро устанавливает обратный вызов для каждого файла, а затем, когда происходит событие, активизирует обратный вызов. Этот механизм устраняет проблемы масштабируемости при очень большом количестве файловых дескрипторов, поскольку опрос не используется в каждой точке.
EPOLLET
— это еще одно значение, которое может иметь events
, переключающее epoll
с запуска уровнем на запуск фронтом сигнала. Эта тема выходит за рамки настоящей книги, и epoll
, запускаемую фронтом, следует применять только в особых случаях.
Структура, показанная в тексте, предоставляет правильные размеры элементов на большинстве платформ, но они неправильны для машин, в которых int
имеет 64 бита.
Эту программу необходимо запускать от имени root для наборов, содержащих более 1000 дескрипторов.
Настоящее тестирование не гарантирует статистическую точность. Был проведен лишь один тестовый прогон, поэтому результаты поначалу будут неустойчивыми, что, однако, исчезнет после большого количества повторов.
Сохранение копии памяти может показаться не столь важным, но благодаря эффективному механизму кэширования Linux, эти задержки копий являются самой медленной частью записи в файлы данных, в которых нет набора O_SYNC
.
Хотя большинство устройств символьного ввода-вывода не могут быть отображены, /dev/zero
отображается именно для этого типа приложений.
Ошибка сегментации возникнет при попытке доступа к нераспределенной странице.
В будущем это может измениться, поскольку в ядре реализуются мелкомодульные системные полномочия.
Файл /etc/passwd
обновляется только процессами, создающими новую копию файла с модификациями и затем заменяющими оригинал с помощью системного вызова rename()
. Поскольку такая последовательность является атомарной, процессы могут считывать из etc/passwd
в любое время.
Читать дальше