in perl, how do we detect a segmentation fault in an external command
perl
Solution
Reading the documentation for `system` might answer your question:
system('a.out');
if ($? == -1) {
print "failed to execute: $!\n";
}
elsif ($? & 127) {
printf "child died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf "child exited with value %d\n", $? >> 8;
}
Output:
child died with signal 11, without coredump
The shell just encodes the signal in the status in a different way: 139 - 128 = 11. For example, `man bash` says:
The return value of a simple command is its exit status, or 128+n if the command is terminated by signal n.
Problem
Following is C code that is destined to crash: ``` #include<stdio.h> #include<stdlib.h> int main() { char *p = NULL; printf("Value at P: %c\n", *p); return 0; } ``` When I compile and run it (RH4 machine with gcc 4.5.2), it predictably gives a segmentation fault: ``` % ./a.out Segmentation fault % echo $status 139 ``` If I run it with Perl v5.8.5, this happens: ``` % perl -e 'system("./a.out") and die "Status: $?"' Status: 11 at -e line 1. ``` The perlvar documentation for `$?` says that Thus, the exit value of the subprocess is really `($?>> 8 )`, and `$? & 127` gives which signal, if any, the process died from, and `$? & 128` reports whether there was a core dump. `11 >> 8` is `0`, and `11 & 127` is `11`. Why the different exit statuses? If we cannot depend on the exit status, what should be the way to detect segmentation fault in an external command?