我使用的是python3.7和subprocess
库。在
我有一个二进制文件my_prog
,它与segfault一起崩溃:
$> ./my_prog
[1] 9328 segmentation fault ./my_prog
在我的脚本main.py
中,我有以下几行代码:
在这种情况下,我得到
$> python3 main.py
-11
b''
好的,子进程捕获信号SIGSEGV。
好的,没有输出。为什么不。在
但是,如果我想让同一个程序在stdin上读取,我必须修改main.py
(文件文本.txt“存在):
output = subprocess.check_output(['./my_prog < text.txt'], shell=True, stderr=subprocess.STDOUT)
在这种情况下,我得到:
$> python3 main.py
139
b'/bin/sh: line 1: 17235 Segmentation fault: 11 ./my_prog < text.txt\n'
我知道是11+128,也就是说西格夫 现在,我有了一个输出!在
即使139和-11的意思是一样的,为什么在这两种不同的情况下返回码会发生变化?为什么第一种情况下没有输出?在
谢谢:)
编辑:
加上输出问题上的差异。在
为了提高效率,shell仅仅是在某些情况下运行的最后一个(或唯一)命令。然后命令是与shell相同的进程,shell是Python脚本的直接子进程,并以通常的方式报告信号(完全是-11)。在
重定向输入可以防止这种情况,也许是为了避免过早关闭终端上打开的所有文件描述符的问题。然后,
my_prog
中的segfault被报告给shell:asif,其中有一个-11,但这实际上是一个Python约定。shell打印一条消息(注意/bin/sh
)和{a1}进入139的退出状态。在在没有
exec
的情况下,它可以通过用相同的信号杀死自己(strace
这样做)来重现信号,但它不需要额外的检查。(这样您就不必怀疑shell本身是否崩溃了。)不幸的是,shell以这种方式进一步限制了可用退出状态的范围,但这已经是老生常谈了。在相关问题 更多 >
编程相关推荐