[sisyphus] Q: Очень непростой вопрос на тему select() и сигналов

Michael Pozhidaev msp на altlinux.ru
Пт Апр 10 20:00:35 MSD 2009


Hello, Sergey Vlasov!

Сергей, спасибо за такое подробное и точное объяснение. Сейчас ещё
приглянулся signalfd(), но как-то пока вызывает сомнение необходимость
иметь свежее ядро. Думаю, что могут ещё найтись желающие пожить, скажем,
на 2.6.18. А в остальном оно прямо в точку. :)

> Для архитектуры i386 системные вызовы pselect6 и ppoll были добавлены в
> ядро в версии 2.6.16, для x86_64 - только в версии 2.6.19 (хотя номера
> системных вызовов в asm/unistd.h были зарезервированы ещё в 2.6.16).
> Однако имеет значение ещё и версия и детали сборки glibc - совсем старые
> версии glibc (до 2.5) предоставляли только бесполезную эмуляцию pselect,
> начиная с glibc-2.5, предусмотрена поддержка настоящего системного вызова,
> но с автоматическим переключением на эмуляцию, если ядро слишком старое и
> возвращает ошибку ENOSYS; кроме того, во время сборки должен быть доступен
> asm/unistd.h с определением __NR_pselect6.  В результате всего этого
> определить, что при вызове программой функции pselect() действительно
> используется этот системный вызов, затруднительно (даже при наличии
> достаточно свежего ядра можно получить эмуляцию либо на древней версии
> glibc, либо даже на новой, но собранной со старыми заголовками ядра).
>
> В Linux есть и другие способы работы с сигналами совместо с select(), не
> имеющие проблем с эмуляцией, не гарантирующей правильную работу:
>
>  - Вариация на тему pipe() - для оповещения основного цикла о пришедшем
>    сигнале можно использовать дескриптор eventfd, требующий несколько
>    меньше ресурсов, чем pipe; системный вызов доступен начиная с ядра
>    2.6.22 (для i386 и x86_64); можно достаточно легко написать код,
>    использующий eventfd при наличии его поддержки, но автоматически
>    переключающийся на pipe при обнаружении устаревшего ядра или glibc.
>
>  - signalfd - позволяет перевести сигналы в готовность файловых
>    дескрипторов; системный вызов доступен начиная с ядра 2.6.22 (для i386
>    и x86_64), поддержка в glibc - начиная с версии 2.8; в ядре 2.6.25 была
>    исправлена обработка сигналов, переданных через sigqueue().
> _______________________________________________
> Sisyphus mailing list
> Sisyphus на lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/sisyphus

-- 
Michael Pozhidaev. E-mail: msp на altlinux.ru.
Tomsk State University. http://www.csd.tsu.ru
ALT Linux Team. http://www.altlinux.org



Подробная информация о списке рассылки Sisyphus