从 bash 脚本,我正在尝试处理来自 c++ 程序的分段错误。我读过 using trap
onSIGCHLD
可用于此目的。在陷阱内部,我应该能够测试$?
以从程序中获取返回码。例如,请参阅https://unix.stackexchange.com/questions/24307。
它对我不起作用,我不知道为什么。
这是脚本:
#! /bin/bash
set -bm
trap 'echo "Trap result code $?"' CHLD
echo "Script: starting program"
./sigsegv
echo "Script: result code from program was $?"
正如您可能猜到的那样,该sigsegv
程序只会导致段错误:
#include <csignal>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
cout << "C++ will now cause a SIGSEGV" << endl;
raise(SIGSEGV);
cout << "After signal -- shouldn't get here" << endl;
return 0;
}
当我运行包装脚本时,我得到了这个:
$./wrappersimple.sh
Script: starting program
C++ will now cause a SIGSEGV
Trap result code 0
./wrapper.sh: line 8: 26368 Segmentation fault (core dumped) ./sigsegv
Script: result code from program was 139
关键是Trap result code 0
。这就是我希望它说 139 表示 SIGSEGV 的地方(即 128 基值 + SIGSEGV 的 11)。
如果它很重要,RHEL 6.2, bash 4.1.2(1)-release。