Я использую этот скрипт для проверки ловушки:
#!/bin/bash
trap "echo segfault!" SIGSEGV
g++ forever.cpp
./a.out
А также forever.cpp
просто запускает рекурсивную функцию:
void forever(){
forever();
}
int main(){
forever();
}
Однако это дает Segmentation fault: 11
вместо печати segfault
, Я не уверен почему.
trap
оператор прерывает сигналы, полученные bash
не ее дети. Ребенок получает segfault и будет выходить с соответствующим кодом выхода. Поэтому вам следует проверить код завершения дочернего процесса. Как вы можете видеть из Вот, код выхода — 128 + номер сигнала. SEGV
это 11 (см. man signal
), поэтому вы получите код выхода 139. Так что просто протестируйте $?
против 139, и вы сделали.
Ловушка bash будет ловить segfault в самом bash, а не в процессе, порожденном bash.
В этом случае вы порождаете процесс, и этот процесс получает segfault. Вам нужно установить обработчик сигнала в C-программе forever.cpp, чтобы поймать это.