|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Dmitry Pryanishnikov 2:464/36 05 Feb 2004 13:10:31 To : All Subject : =?koi8-r?B?UmU6IKqlvqubub6lgomGpZMu?= --------------------------------------------------------------------------------
Привет!
On Wed, 4 Feb 2004, Max Khon wrote:
> d> головы и хвоста очереди. IMHO единставенное правильное решение -
> d> блокировать доставку этого сигнала при помощи sigprocmask, затем
> d> сделать с очередью все, что нужно, и затем деблокировать доставку
> d> сигнала вторым вызовом sigprocmask.
>
> это все не нужно. см. пример который Lev Walkin привел.
Поскольку ко мне не гейтуются письма из fido7, я отвечаю на все, что вижу по
этой теме на google. Итак, to Constantin Stefanov по поводу ^C^C - можно жать
сколько угодно, после разблокировки доставки придет один сигнал, и IMHO так у
них и задумано, see man 2 sigaction:
When a signal condition arises for a process, the signal is added to a
set of signals pending for the process.
Если буквально понимать это описание, ведется просто битовая маска сигналов,
которые нужно доставить (ее можно получить по sigpending()), а не очередь
запросов на прерывание (если это не так - прошу меня поправить, по описанию
вроде должно быть так). Поэтому случай с заблокированной по sigprocmask
доставкой IMHO ничуть не хуже, чем просто ситуация, когда второй раз нажали
^C, а программа еще не получила процессорное время для обработки первого.
Кроме того, на время отработки обработчика сигнала доставка этого же сигнала
автоматически блокируется так же, как и простым вызовом sigprocmask. Поэтому
потерять приход одного сигнала sigprocmask не даст, а приход нескольких с
одним номером не гарантирован в любом случае.
Теперь to Max Khon: Lev Walkin написал практически то же, что и я, но это
не отменяет необходимости заботиться о целостности очереди. Поэтому еще раз,
если по условию задачи четко нужно менять очередь (возможно, где-то в
середине) и в основном коде, и в сигнальном обработчике, и при этом нельзя
"спустить указание" (поставить по сигналу только флаг, а обработать его в
основной ветке), то при модификации в основном коде необходима блокировка
доставки сигнала sigprocmask. Я других вариантов не вижу.
Sincerely, Dmitry
--
Atlantis ISP, System Administrator
e-mail: dmitry@atlantis.dp.ua
nic-hdl: LYNX-RIPE
--- ifmail v.2.14.os-p7
* Origin: Atlantis ISP (2:464/36@fidonet)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/24521459c042c.html, оценка из 5, голосов 10
|