SIGSEGV поставляется в каждую нить?

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

Ответы

Ответ 1

Прежде всего

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

Но прочитайте

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

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

Я цитирую TLPI.

Ответ 2

Нет, по заголовку вопроса.

В теле вопроса: для конкретного сигнала, который вы запрашиваете, да (в противном случае: это зависит). Поток, вызывающий 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 [...].