我正在使用twisted來產生本地進程,這可能會在某種情況下終止。如何獲取可能會意外終止的扭曲spawn過程的退出代碼?
我有一個自定義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的例子將打印
錯誤終止:失敗實例:回溯(失敗,沒有 幀)::進程 已經以可能的錯誤條件結束:進程以信號6結束。 ]; exitCode:無;信號:6
如果在shell中運行C++示例,則返回值爲134,即發送SIGABRT
(6)。 (我也測試過發送SIGINT
終止並且仍然沒有退出代碼。)
我怎樣才能得到它在ProcessProtocal
實例?或者這是不可能的?
所以......你想134而不是6?或者是什麼? –
@ Jean-PaulCalderone我想在這個扭曲的過程協議實例中獲得134或任何其他返回值,而不是上面例子中的'None'。 – halfelf