python - 确定 python 子进程段错误

标签 python segmentation-fault subprocess

我正在编写一个对学生程序进行评分的程序,我相信您可以想象,它们有时会出现段错误。我遇到的问题是,当学生编写段错误时,没有任何迹象表明发生了什么。

proc = subprocess.Popen(student_command, 
                        stdout=subprocess.PIPE, 
                        stderr=subprocess.PIPE)
self.stdout, self.stderr = proc.communicate()
self.returncode = proc.returncode

我从 subprocess 中获取 stderrstdout 和返回码,但是如果程序段错误, stderr 为空,stdout 为空,返回码为-11。现在我可以查找 -11 退出代码并假设如果那是返回代码,则存在段错误,但也没有什么可以阻止学生的代码将 -11 作为返回代码只是因为学生想要返回-11.

您如何判断子流程分段是否出错,而不是仅仅感觉返回 -11?我不太关心 stderr 和 stdout 中的内容,为此我看过很多帖子,包括 this处理获取输出,但我不太关心输出,虽然从 stderr 中获取“Segmentation Fault”字符串会很好,但我真正需要的是一种明确告诉什么的方法发生在子进程上。

最佳答案

事实上,在 UNIX 上,尝试返回 -11 的进程通常最终会返回一个正整数。这是因为 wait 系列函数的返回状态实际上是一组位字段,其中一个字段用于结束进程的信号,另一个字段用于返回值。 Python 解码来自这些位域的 wait 返回值。

在大多数系统上,这些字段是无符号的,大小为 8 位,因此您可能会看到如下内容:

>>> import subprocess
>>> subprocess.Popen(['python','-c','import os; os.kill(os.getpid(),11)']).wait()
-11
>>> subprocess.Popen(['python','-c','exit(-11)']).wait()
245

在前一种情况下,进程“出现段错误”(通过使用 SIGSEGV 终止自身),因此 wait 返回 -11。在后一种情况下,进程退出并返回代码 -11,生成的 wait 值为 245 (256-11)。因此,您可以放心,wait 的任何负返回值都必须表示致命信号,而不是正常返回。但请注意,进程可能会自杀以伪造 fatal error 。

关于python - 确定 python 子进程段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18731791/

相关文章:

c - 段错误(核心转储)...BMH 算法

python - 通过从第一个列表中获取第一项和从第二个列表中获取最后一项来创建新列表

python - python pandas 转换 Unix 时间戳

python - 使用 argparse 显示隐藏选项

c - 无法解释的段错误

python - Popen 管道 2 cmd 挂起并且没有给出预期的结果

python - 如何使用 openpyxl 仅解析工作簿中的特定工作表 - 或者如何忽略空工作表?

c - C中的段错误

python - 从 python 脚本运行 C# 应用程序

python - 子进程调用错误,无效应用程序