ловушка не может поймать SIGSEGV

Я использую этот скрипт для проверки ловушки:

#!/bin/bash

trap "echo segfault!" SIGSEGV
g++ forever.cpp
./a.out

А также forever.cpp просто запускает рекурсивную функцию:

void forever(){
forever();
}
int main(){
forever();
}

Однако это дает Segmentation fault: 11 вместо печати segfault, Я не уверен почему.

0

Решение

trap оператор прерывает сигналы, полученные bashне ее дети. Ребенок получает segfault и будет выходить с соответствующим кодом выхода. Поэтому вам следует проверить код завершения дочернего процесса. Как вы можете видеть из Вот, код выхода — 128 + номер сигнала. SEGV это 11 (см. man signal), поэтому вы получите код выхода 139. Так что просто протестируйте $? против 139, и вы сделали.

3

Другие решения

Ловушка bash будет ловить segfault в самом bash, а не в процессе, порожденном bash.

В этом случае вы порождаете процесс, и этот процесс получает segfault. Вам нужно установить обработчик сигнала в C-программе forever.cpp, чтобы поймать это.

4

По вопросам рекламы [email protected]