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 [...].