Когда Линус Торвальдс впервые реализовал select()
, неспособность ядра BSD обновлять timeout
была отмечена как ошибка на man-странице для select()
. Вместо написания ошибочного кода Линус решил 'исправить' эту ошибку. К сожалению, комитеты по стандартам одобрили поведение BSD.
79
Фактически ядро устанавливает обратный вызов для каждого файла, а затем, когда происходит событие, активизирует обратный вызов. Этот механизм устраняет проблемы масштабируемости при очень большом количестве файловых дескрипторов, поскольку опрос не используется в каждой точке.
80
EPOLLET
— это еще одно значение, которое может иметь events
, переключающее epoll
с запуска уровнем на запуск фронтом сигнала. Эта тема выходит за рамки настоящей книги, и epoll
, запускаемую фронтом, следует применять только в особых случаях.
81
Структура, показанная в тексте, предоставляет правильные размеры элементов на большинстве платформ, но они неправильны для машин, в которых int
имеет 64 бита.
82
Эту программу необходимо запускать от имени root для наборов, содержащих более 1000 дескрипторов.
83
Настоящее тестирование не гарантирует статистическую точность. Был проведен лишь один тестовый прогон, поэтому результаты поначалу будут неустойчивыми, что, однако, исчезнет после большого количества повторов.
84
Сохранение копии памяти может показаться не столь важным, но благодаря эффективному механизму кэширования Linux, эти задержки копий являются самой медленной частью записи в файлы данных, в которых нет набора O_SYNC
.
85
Хотя большинство устройств символьного ввода-вывода не могут быть отображены, /dev/zero
отображается именно для этого типа приложений.
86
Ошибка сегментации возникнет при попытке доступа к нераспределенной странице.
87
В будущем это может измениться, поскольку в ядре реализуются мелкомодульные системные полномочия.
88
Файл /etc/passwd
обновляется только процессами, создающими новую копию файла с модификациями и затем заменяющими оригинал с помощью системного вызова rename()
. Поскольку такая последовательность является атомарной, процессы могут считывать из etc/passwd
в любое время.
89
Файловая система Andrew Filesystem (AFS), доступная в Linux, но не включенная в стандартное ядро, поддерживает O_EXCL
во всей сети.
90
Эта ситуация более сложна для потоков. Многие ядра и библиотеки Linux рассматривают потоки как разные процессы, что увеличивает потенциал возникновения конфликтов файловых блокировок между потоками (а это не совместимо со стандартной моделью потоков POSIX). Linux предлагает более традиционную модель потоков, при которой файловые блокировки разделяются между всеми потоками одного процесса, но в многопоточных программах лучше применять потоковые механизмы блокировки POSIX, а не полагаться на поведение файловых блокировок.