考虑以下程序:
int main()
{
*((int*)0) = 5;
return 0;
}
编译并在bash
上运行会产生:
$ ./crash
Segmentation fault (core dumped)
$ echo $?
139
如果我通过以下Python脚本驱动程序,
import subprocess as sp
p = sp.Popen('./crash')
p.wait()
print 'crash: %d' % p.returncode
它产生了这个:
$ python retcode.py
crash: -11
返回值为-11
,因为documentation说,
负值-N表示孩子被信号终止 N(仅适用于Unix)。
SIGSEGV
是信号11
(kill -l
)
如果我在原始程序中安装了信号处理程序,
#include<signal.h>
#include<stdlib.h>
#include<stdio.h>
void handler(int sig)
{
printf("I am the handler\n");
exit(128+sig);
}
int main()
{
signal(SIGSEGV, handler);
*((int*)0) = 5;
return 0;
}
从bash
编译并运行它会产生
$ ./crash_sighandle
I am the handler
$ echo $?
139
但是,如果我使用上面的Python脚本驱动相同的程序,则会得到
$ python retcode.py
I am the handler
crash: 139
简而言之,Popen()
看到的返回值不同于-11
。我尝试了其他一些变化。没有一个产生预期的结果(-11
)。即使安装了信号处理程序后,我如何也可以获得一致的返回值