c++bashsegmentation-faultbash-trap

trap fails to catch SIGSEGV


I'm using this script to test trap:

#!/bin/bash

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

And forever.cpp just runs a recursive function:

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

However it gives Segmentation fault: 11 instead of printing segfault. I'm not sure why.


Solution

  • The trap statement traps signals received by bash, not its children. The child receives the segfault and will be exiting with an appropriate exit code. You should therefore check the exit code from the child process. As you can see from here, the exit code is 128+signal number. SEGV is 11 (see man signal), so you will get an exit code of 139. So simply test $? against 139, and you have done.