gpt4 book ai didi

python-3.x - $的退出状态?发生段错误时使用python

转载 作者:行者123 更新时间:2023-12-04 01:50:36 24 4
gpt4 key购买 nike

我需要执行 echo $?使用 python3 并捕获退出状态。我特别需要这个来捕获 Segmentation fault (core dumped)地位。
我试过 :

>>> os.system('echo $?')
0
0
得到 0 0 .此外,对于段错误,
>>> os.system('./a.out')
Segmentation fault (core dumped)
35584
执行上述命令后,我再次得到:
>>> os.system('echo $?')
0
0
还有,为什么是 0打印两次?
我浏览了 python-3 的文档,其中说:

os.system(command)

On Unix, the return value is the exit status of the process encoded in the format specified for wait(). Note that POSIX does not specify the meaning of the return value of the C system() function, so the return value of the Python function is system-dependent.


这是否说明了这种行为?
帮我澄清一下。
注:我已经运行了 ulimit -c unlimited在上述所有步骤之前。预期结果应为非零或 139(具体而言)。
编辑:我在想是否对此有限制!
谢谢!

最佳答案

不,您不需要执行 echo $? .它不会有用。程序的退出状态是函数os.system的返回值.那是什么号码35584是。 documentation os os.system 告诉你阅读 documentation of os.wait 这解释了

a 16-bit number, whose low byte is the signal number that killed the process, and whose high byte is the exit status (if the signal number is zero); the high bit of the low byte is set if a core file was produced.



但是,请注意,取决于 shell,使用 os.system('./a.out') ,您可能会收到 a.out 的退出状态或 shell 本身的退出状态。通常没有区别,因为 shell 的退出状态是它执行的最后一个命令的退出状态。但是,如果命令因信号而消失,则存在差异。 shell 不会用相同的信号杀死自己,它会返回一个对信号进行编码的状态。在大多数 shell 中,这是 128 + signal_number .例如,如果程序死于信号 11(Linux 上的段错误)并留下核心转储,则其状态由 wait 返回。是 11。但是如果中间有一个 shell,那么 shell 会以退出代码 128+11 正常退出。这就是你所看到的:35584 是 (128 + 11) << 8 .

为避免这种复杂情况,请使用 subprocess.call 或其变体之一(如果您不需要代码来运行 Python <=3.4,您可以使用 subprocess.run)。
returncode = subprocess.call(['./a.out'], shell=False).returncode
if returncode & 0xff == 0:
exit_code = returncode >> 8
print('The program exited normally with status {}.'.format(exit_code))
else:
print('The program was killed by signal {}.'.format(returncode))

如果您运行 os.system('echo $?') , 这将启动一个新的 shell。您正在打印 $? 的初始值在那个 shell 中,在它运行任何命令之前,以及 $? 的初始值在 shell 中为 0。

你看 0在交互式环境中两次,因为第一个是 echo 打印的那个。命令,第二个是 Python 表达式的值。比较 os.system('echo hello') .

请注意,使用 os.system ,你不能访问命令的输出,所以如果你用 echo 打印一些东西,你不能在程序中使用它。您必须使用 subprocess module 中的函数为此,但仅当您需要 ./a.out 的输出时才需要这个, 不获取其退出状态。

关于python-3.x - $的退出状态?发生段错误时使用python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50903427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com