The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"создать поток с определенной маской сигналов"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"создать поток с определенной маской сигналов"  +/
Сообщение от аноним on 12-Авг-09, 00:38 
Как известно, при создании потока маска сигналов наследуется. Мне же нужно создать поток со всеми заблокированными сигналами, не блокируя их в порождающем потоке. Это вообще реально или только костылями (т.е. создавать еще один поток)?
Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "создать поток с определенной маской сигналов"  +/
Сообщение от svn (??) on 12-Авг-09, 00:57 
Сигналы применимы к процессу а не к потокам. При получении сигнала ПРОЦЕССОМ, вызывается обработчик сигнала ПРОЦЕССА.

PS: Если если ты не используешь posix потоки, указывай реализацию.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "создать поток с определенной маской сигналов"  +/
Сообщение от аноним on 12-Авг-09, 17:46 
>Сигналы применимы к процессу а не к потокам. При получении сигнала ПРОЦЕССОМ,
>вызывается обработчик сигнала ПРОЦЕССА.

Да что ты? И каким же потоком процесс его обработает? man pthread_sigmask, а мой вопрос все еще открыт.

>PS: Если если ты не используешь posix потоки, указывай реализацию.

posix, posix.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "создать поток с определенной маской сигналов"  +/
Сообщение от DeadMustdie email(??) on 12-Авг-09, 21:05 
>Как известно, при создании потока маска сигналов наследуется. Мне же нужно создать
>поток со всеми заблокированными сигналами, не блокируя их в порождающем потоке.
>Это вообще реально или только костылями (т.е. создавать еще один поток)?
>

Насколько я понимаю SUSv3, стандартом не предусмотрен механизм установки маски сигналов на создаваемый поток, не совпадающей с маской сигналов родительского потока и притом действующей с момента создания потока. Собственно, интерфейс к такому механизму мог бы быть реализован через атрибуты создаваемого потока, передаваемые в функцию pthread_create(), но на данный момент такие атрибуты стандартом не определены.

Есть два вполне прямых варианта реализации сходной функциональности:
  1. Временно установить нужную маску сигналов в родительском потоке, после создания дочернего потока вернуть исходную маску.
  2. В самом начале дочернего потока установить нужную маску сигналов.

В обоих случаях отличие получаемого результата от исходного желаемого IMHO несущественны для практических применений (кроме разве что грязного насилия над чужими готовыми программами без исходных кодов ;) )

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "создать поток с определенной маской сигналов"  +/
Сообщение от аноним on 12-Авг-09, 21:40 
>Насколько я понимаю SUSv3, стандартом не предусмотрен механизм установки маски сигналов на
>создаваемый поток, не совпадающей с маской сигналов родительского потока и притом
>действующей с момента создания потока. Собственно, интерфейс к такому механизму мог
>бы быть реализован через атрибуты создаваемого потока, передаваемые в функцию pthread_create(),
>но на данный момент такие атрибуты стандартом не определены.

Понятно, спасибо.

>Есть два вполне прямых варианта реализации сходной функциональности:
>  1. Временно установить нужную маску сигналов в родительском потоке, после
>создания дочернего потока вернуть исходную маску.

И сигнал будет потерян, потому что заблокирован во всех потоках.

>  2. В самом начале дочернего потока установить нужную маску сигналов.

И сигнал может получить дочерний поток, что очень-очень плохо.

Обе ситуации весьма вероятны.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "создать поток с определенной маской сигналов"  +/
Сообщение от DeadMustdie email(??) on 12-Авг-09, 22:28 
>>  1. Временно установить нужную маску сигналов в родительском потоке, после
>>создания дочернего потока вернуть исходную маску.
>
>И сигнал будет потерян, потому что заблокирован во всех потоках.
>
>>  2. В самом начале дочернего потока установить нужную маску сигналов.
>
>И сигнал может получить дочерний поток, что очень-очень плохо.
>
>Обе ситуации весьма вероятны.

Ситуация (1) прекрасно обходится созданием при старте программы специального
потока (или набора таковых при необходимости) для обработки сигналов.

Лично я вообще предпочитаю принимать сигналы явным образом через вызов
sigwait(), нежели ловить их на прилетевшие "из космоса" обработчики
в непонятных точках с приостановкой исполнения основной программы.
Это целиком дело вкуса, конечно.

Ситуация (2) IMHO совершенно безвредна, поскольку сигнал с равным успехом
будет обработан как в родительском потоке (до изменения его атрибутов),
так и в дочернем.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "создать поток с определенной маской сигналов"  +/
Сообщение от аноним on 12-Авг-09, 22:32 
>Ситуация (1) прекрасно обходится созданием при старте программы специального
>потока (или набора таковых при необходимости) для обработки сигналов.
>
>Лично я вообще предпочитаю принимать сигналы явным образом через вызов
>sigwait(), нежели ловить их на прилетевшие "из космоса" обработчики
>в непонятных точках с приостановкой исполнения основной программы.
>Это целиком дело вкуса, конечно.

Во, точно мои мысли. Именно так и делаю.

>Ситуация (2) IMHO совершенно безвредна, поскольку сигнал с равным успехом
>будет обработан как в родительском потоке (до изменения его атрибутов),
>так и в дочернем.

Нет, если поведение зависит от прерванных syscall'ов.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "создать поток с определенной маской сигналов"  +/
Сообщение от DeadMustdie email(??) on 12-Авг-09, 22:38 
>Во, точно мои мысли. Именно так и делаю.

Тогда не должен возникнуть исходный вопрос ;)
Логика тривиальная:
1. Блокируем обработку сигналов на уровне основного потока при старте программы.
   Все прочие потоки наследуют маску основного потока.
2. Создаем поток (или потоки) обработки сигналов, крутимся там в вызове sigwait().
   Никаких потерь сигналов не будет, так как в условиях блокирования через маску
   сигналы становятся в очередь локальную (на процесс) очередь сигналов.

>>Ситуация (2) IMHO совершенно безвредна, поскольку сигнал с равным успехом
>>будет обработан как в родительском потоке (до изменения его атрибутов),
>>так и в дочернем.
>
>Нет, если поведение зависит от прерванных syscall'ов.

Если совсем честно, то это кривой код. EINTR - вполне нормальный код возврата,
и обязательное по сути поведение прикладного кода в этом случае вполне определено
всё тем же стандартом.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "создать поток с определенной маской сигналов"  +/
Сообщение от аноним on 12-Авг-09, 23:09 
>Тогда не должен возникнуть исходный вопрос ;)

Вопрос возник, потому что для sigwait пришлось изменять логику работы программы.

>Логика тривиальная:

Это я и сам знаю.

>>Нет, если поведение зависит от прерванных syscall'ов.
>
>Если совсем честно, то это кривой код. EINTR - вполне нормальный код возврата

Да, но поведение зависит от того, в каком потоке сигнал был получен.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру