Python子进程:在这种情况下,segfault程序返回11或139?

2024-04-26 02:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3.7和subprocess库。在

我有一个二进制文件my_prog,它与segfault一起崩溃:

$> ./my_prog
[1]    9328 segmentation fault  ./my_prog

在我的脚本main.py中,我有以下几行代码:

^{pr2}$

在这种情况下,我得到

$> 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的意思是一样的,为什么在这两种不同的情况下返回码会发生变化?为什么第一种情况下没有输出?在

谢谢:)

编辑
加上输出问题上的差异。在


Tags: 文件textpytxtoutputmainmy二进制
1条回答
网友
1楼 · 发布于 2024-04-26 02:30:06

为了提高效率,shell仅仅是在某些情况下运行的最后一个(或唯一)命令。然后命令是与shell相同的进程,shell是Python脚本的直接子进程,并以通常的方式报告信号(完全是-11)。在

重定向输入可以防止这种情况,也许是为了避免过早关闭终端上打开的所有文件描述符的问题。然后,my_prog中的segfault被报告给shell:asif,其中有一个-11,但这实际上是一个Python约定。shell打印一条消息(注意/bin/sh)和{a1}进入139的退出状态。在

在没有exec的情况下,它可以通过用相同的信号杀死自己(strace这样做)来重现信号,但它不需要额外的检查。(这样您就不必怀疑shell本身是否崩溃了。)不幸的是,shell以这种方式进一步限制了可用退出状态的范围,但这已经是老生常谈了。在

相关问题 更多 >