SIGSEGV доставляется в каждый поток? - PullRequest
15 голосов
/ 30 июня 2011

У меня есть программа в Linux, которая является многопоточной.Есть определенные области памяти, в которых мне интересно посмотреть, были ли они написаны в течение определенного периода времени.Для этого я даю доступ только для чтения к этим страницам памяти и устанавливаю обработчик сигнала для SIGSEGV.Теперь мой вопрос, будет ли каждый поток вызывать обработчик сигнала для себя.Скажем, Поток 1 пишет в какую-то запрещенную область памяти, будет ли она выполнять обработчик сигнала?

Ответы [ 2 ]

22 голосов
/ 30 июня 2011

Прежде всего

Распределение сигналов распространяется на весь процесс;все потоки в процессе имеют одинаковое расположение для каждого сигнала.Если один поток использует sigaction () для установки обработчика, скажем, SIGINT, то этот обработчик может быть вызван из любого потока, в который доставлен SIGINT.*

Сигнал может быть направлен либо на весь процесс в целом, либо на конкретный поток .Сигнал направлен на поток, если

он генерируется как прямой результат выполнения определенной аппаратной инструкции в контексте потока (SIGBUS, SIGFPE, SIGILL, and SIGSEGV)

Я цитирую от TLPI.

6 голосов
/ 30 июня 2011

Нет, по названию вопроса.

К телу вопроса: для конкретного сигнала, который вы запрашиваете, да (иначе: это зависит). Поток, вызывающий segfault, получит сигнал.

См. сигнал (7) :

A signal may be generated (and thus pending) for a process as a whole (e.g.,
when sent using kill(2)) or for a specific thread (e.g., certain signals, such
as SIGSEGV and SIGFPE, generated as a consequence of executing a specific
machine-language instruction are thread directed [...].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...