zel*_*nka 14 python subprocess segmentation-fault
我正在编写一个对学生课程进行评分的程序,我相信你可以想象,他们有时会分段错误.我遇到的问题是,当学生编程分段错误时,没有迹象表明发生了什么.
proc = subprocess.Popen(student_command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = proc.communicate()
self.returncode = proc.returncode
Run Code Online (Sandbox Code Playgroud)
我拿起标准错误,stdout和从子进程的返回码,但如果程序分段错误,标准错误是空的,stdout是空的,返回代码为-11.现在,我可以寻找-11退出代码,并假设如果是这样的返回码有分段错误,但也无法阻止学生的代码有-11作为返回代码只是因为学生觉得好像回到-11.
你如何判断子进程分段是否有问题,而不仅仅是感觉像返回-11?我对stderr和stdout中的内容并不是那么关心,为此我已经看到了一些包含这个问题的帖子来处理输出,但我并不关心输出,虽然从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
Run Code Online (Sandbox Code Playgroud)
在前一种情况下,进程"segfaults"(通过使用SIGSEGV自杀),因此wait返回-11.在后一种情况下,进程以返回码-11退出,结果wait值为245(256-11).因此,您可以放心,任何负返回值wait必须代表致命信号,而不是正常回报.但请注意,进程可能会自行杀死以伪造致命错误.
| 归档时间: |
|
| 查看次数: |
2591 次 |
| 最近记录: |