为什么自定义信号处理程序会更改Python subprocess.Popen()的returncode值?

时间:2019-01-13 08:57:44

标签: signals return-value popen

考虑以下程序:

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是信号11kill -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)。即使安装了信号处理程序后,我如何也可以获得一致的返回值

0 个答案:

没有答案