gpt4 book ai didi

python - 如何获取可能意外终止的扭曲生成进程的退出代码?

转载 作者:太空宇宙 更新时间:2023-11-03 15:39:50 26 4
gpt4 key购买 nike

我正在使用twisted来生成本地进程,该进程可能会在某些情况下终止。

我有一个用于 react 器的自定义 twisted.internet.protocol.ProcessProtocol 类。如果本地进程突然终止,我无法在 processEnded 中获取返回值。 exitCode 设置为 None

mcv 示例如下:

from twisted.internet import error,protocol,reactor

class MyPP(protocol.ProcessProtocol):
def processEnded(self, reason):
if reason.check(error.ProcessTerminated):
err_info = "wrong termination: %s; exitCode: %s; signal: %s" % \
(reason, reason.value.exitCode, reason.value.signal)
print(err_info)
else:
print("processEnded, status %d" % (reason.value.exitCode,))
print("quitting")
reactor.stop()

pp = MyPP()
reactor.spawnProcess(pp, "throw_exception", ["throw_exception"], {})
reactor.run()

并且 throw_exception 可执行文件可以从以下位置编译:

#include <iostream>
int main() {
throw std::runtime_error("some exception");
return 0;
}

执行python示例将打印

wrong termination: [Failure instance: Traceback (failure with no frames): : A process has ended with a probable error condition: process ended by signal 6. ]; exitCode: None; signal: 6

如果在 shell 中运行,C++ 示例的返回值为 134,这意味着已发送 SIGABRT(6)。 (我还测试过发送 SIGINT 来终止,但仍然没有得到退出代码。)

如何在 ProcessProtocal 实例中获取它?还是不可能?

最佳答案

在您的示例中,134 是“等待状态”(或者在手册页中为“wstatus”)。它对 wait() 进程所经历的运行状态转换的一些信息进行编码。

可能的转换是:

  • 使用代码退出(即称为exit(2))
  • 被信号杀死
  • 是否生成核心转储
  • 被停止(例如通过SIGSTOP)
  • 未停止(例如使用 SIGCONT)

POSIX 提供了用于从等待状态中提取详细信息的宏:WIFEXITEDWIFSIGNALEDWTERMSIGWEXITSTATUS

Python 通过 os 模块公开这些:os.WIFEXITED 等。

os.WIFEXITED(134) 计算结果为 Falseos.WIFSIGNALED(134) 计算结果为 true,os.WTERMSIG(134) 计算结果为 6

ProcessDoneProcessTermminate 使用这些宏来提取信息并以稍微更有用的形式呈现它 - exitCode信号属性。

不过,POSIX 没有提供其他的方法。没有标准 API 可以用来构建“等待状态”,例如“进程被信号 6 终止”。

幸运的是,部分原因是无法返回,Twisted 将异常的原始等待状态保留为 status 属性。如果您检查传递给 ProcessProtocolFailure 中包含的异常的该属性,您应该会找到您正在查找的等待状态。

关于python - 如何获取可能意外终止的扭曲生成进程的退出代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42240971/

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