From: Sergey Vlasov <vsu@altlinux.ru> To: sisyphus@lists.altlinux.org Subject: Re: [sisyphus] Q: Очень непростой вопрос на тему select() и сигналов Date: Fri, 10 Apr 2009 16:36:04 +0400 Message-ID: <20090410123604.GB23228@newmaster.mivlgu.local> (raw) In-Reply-To: <200904101340.09544.sem@altlinux.ru> [-- Attachment #1: Type: text/plain, Size: 2656 bytes --] On Fri, Apr 10, 2009 at 01:40:09PM +0400, Mikhail Efremov wrote: > On Friday 10 April 2009 05:50:01 Michael Pozhidaev wrote: > > Трюк с pipe(), чтобы проинформировать о сигнале пока трогать не буду. Тем не менее этот "трюк" обеспечивает совместимость с наибольшим количеством систем (не только различных версий Linux). > Все так, это гарантируется стандартом. Вот только стандарт стандартом, а его > конкретная реализация - это конкретная реализация, в той или иной степени > этот стандарт поддерживающая. Раньше в Linux не было системного вызова > pselect, была эмуляция в glibc, проблемы не решающая. Начиная с 2.6.какой-то > версии ядра такой вызов есть, но я не знаю как он работает. Впрочем, не > думаю, что есть смысл делать системный вызов, не решающий проблему с race. > Может кто из знатоков ядра скажет по этому поводу больше. Для архитектуры 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(). [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 189 bytes --]
next prev parent reply other threads:[~2009-04-10 12:36 UTC|newest] Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top 2009-04-09 22:48 Michael Pozhidaev 2009-04-09 23:49 ` Mikhail Efremov 2009-04-10 1:50 ` Michael Pozhidaev 2009-04-10 9:40 ` Mikhail Efremov 2009-04-10 12:36 ` Sergey Vlasov [this message] 2009-04-10 16:00 ` Michael Pozhidaev 2009-04-10 16:22 ` Mikhail Efremov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20090410123604.GB23228@newmaster.mivlgu.local \ --to=vsu@altlinux.ru \ --cc=sisyphus@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
ALT Linux Sisyphus discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/sisyphus/0 sisyphus/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 sisyphus sisyphus/ http://lore.altlinux.org/sisyphus \ sisyphus@altlinux.ru sisyphus@altlinux.org sisyphus@lists.altlinux.org sisyphus@lists.altlinux.ru sisyphus@lists.altlinux.com sisyphus@linuxteam.iplabs.ru sisyphus@list.linux-os.ru public-inbox-index sisyphus Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.sisyphus AGPL code for this site: git clone https://public-inbox.org/public-inbox.git