Проект NLnet по сигналам в стиле Unix завершён: сигналы реального времени в relibc
19.02.2026Трёхлетний проект NLnet по сигналам в стиле Unix закрыт. По ходу починено то, из-за чего сигналы реального времени не работали: они не будили поток, не блокировались маской и не попадали в набор сигналов.
Зачем различать сигналы реального времени
Обычный сигнал сообщает программе «произошло событие». Сигнал реального времени несёт ещё и значение, а значит несколько сигналов одного вида ставятся в очередь, а не сливаются. Это то, на чём работают таймеры с большим разрешением, синхронизация по времени и часть сетевого кода.
Различие не только вPayload, но и в правилах обработки: у сигналов реального времени отдельные пределы очереди, отдельные маски и отдельный путь пробуждения потока.
Что было сломано
Перечисленные в сводке исправления складываются в одну картину: поддержка сигналов реального времени существовала, но была недоделана на каждом уровне.
- сигнал реального времени не будил поток — вместо срабатывания происходила опечатка в условии, и поток оставался ждать;
pthread_sigmaskне блокировал сигналы реального времени, то есть маска работала не для всех;sigismemberне считал их частью набора сигналов;sigtimedwaitиsigwaitinfoвозвращали не номер сигнала;- не соблюдался предел очереди в
sigqueue— ошибка на единицу; - обычные сигналы отправлялись неверным вызовом.
Отдельно приведён в соответствие со спецификацией тип sa_flags в sigaction, объявленный как 64-битный беззнаковый вместо целого.
Почему это важно для Rust
Асинхронное программирование в Rust стоит на сигналах. Исполнение задач, пробуждение по таймеру, отмена — всё это реализовано через tokio и async-io, а те, в свою очередь, через сигналы. Условные переменные и ожидание потоков в стандартной библиотеке — тоже.
Ошибка «сигнал не будит поток» проявляется как зависание: программа ждёт события, которое произошло. Найти такое в коде, написанном на высоком уровне, практически невозможно — виновата оказывается одна опечатка в ядре или библиотеке C.
Про статус проекта
Проект закрыт, и это само по себе инженерное событие: три года работы над подсистемой, от которой зависит всё асинхронное программирование на системе. Финансирование шло от NLnet.
Оговорка: дата завершения проекта известна только из сводки, отдельной датированной страницы с этим фактом нет. Поэтому новость датирована по последней из правок, а не по объявлению о завершении.
Оригинал
Коммит change sa_flags in sigaction to int to match spec от 19 февраля 2026 года в репозитории redox-os/relibc; правки пробуждения и лимита очереди — в redox-os/base 5 и 1 февраля, снятие маски перед запуском — в redox-os/ion 16 февраля. Сводка «This Month in Redox — February 2026», разделы «NGI Zero and NLnet Projects», «System Improvements» и «Relibc Improvements»
Упоминаний: 1 · Просмотров: 2