Проект 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