2016-07-04 3 views
1

Я хотел бы закрыть сокет, но прежде, чем уведомить все блокировки потоков на accept/connect, поэтому я посылаю сигнал, специфичный для пользователя, но не зная о приеме потоков, принимающих сигнал. Я не могу использовать syscall kill(pid, signal)Есть ли способ отправить сигнал всем потокам, открывающим fd?

+0

использовать 'shutdown()' как описано в http://stackoverflow.com/questions/2486335/wake-up-thread-blocked-on-accept-call – Fazlin

+0

Вы можете просто отправить им SIGPIPE, если они попытаются написать к закрытому гнезду, или организовать, чтобы какие-либо чтения вернули индикатор, что розетка закрыта. –

+0

Но как насчет разъемов UDP, я не могу использовать SIGPIPE – Bionix1441

ответ

2

Почему бы просто не отключить сокет без уведомления? Каждый поток, который заблокирован при приеме или чтении из этого гнезда, вернется с соответствующей ошибкой, которую вы можете проанализировать, чтобы предпринять необходимые действия.

+0

Я верю, что shutdown для TCP только исправляет меня, если я ошибаюсь – Bionix1441

+0

Ум, вы правы, я не знал, что вы используете UDP. Затем вам придется использовать любые методы IPC ... названные сокеты, разделяемая память и т. Д. –

0

Да. Вы можете отправить сигнал всем работающим потокам через системный вызов: kill(). Используйте это как: Убить (0, signal_id) Здесь '0' представляет собой широковещательный сигнал для всего процесса. Процесс ", который зарегистрирован для широковещательного сигнала, выполнил их обработчик сигналов для дальнейших действий.

+0

'kill()' посылает сигнал процессу. Если этот процесс многопоточен, то один из потоков процесса получит сигнал (если не заблокирован). Поэтому 'kill()' не является вариантом для обращения к конкретным *** нитям ***. – alk

Смежные вопросы