问题
给定一个在 python 中启动的子进程,其代码类似于:
import subprocess
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.communicate()
print('Return code: {}'.format(p.returncode))
根据官方文档 https://docs.python.org/3.7/library/subprocess.html#subprocess.CompletedProcess.returncode,可以检查子进程是否被信号终止:
负值 -N 表示子进程被信号 N 终止(仅限 POSIX)。
但仅限于 POSIX 平台。
有没有办法在 Windows 平台上检查进程是否被信号终止(不关心是哪个信号)?
背景
我在运行 googletest 测试时遇到了这个问题。这故障中断 CLI 标志测试 https://github.com/google/googletest/blob/2fe3bd994b3189899d93f1d5a881e725e046fdc2/googletest/test/googletest-break-on-failure-unittest_.cc在 Windows 平台(VC14、VS2017)上失败,但在 POSIX 平台(2x Ubuntu、2x macOS)上运行良好。
在命令行上手动,我得到以下结果:
> .\googletest-break-on-failure-unittest_.exe --gtest_break_on_failure
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from Foo
[ RUN ] Foo.Bar
<some path>\googletest\test\googletest-break-on-failure-unittest_.cc(52): error: Expected equality of these values:
2
3
> echo %ERRORLEVEL%
-2147483645
但是,调用此测试的 python 包装器接收2147483651
(正数)。
(我之前刚刚添加了一个打印这条线 https://github.com/google/googletest/blob/2fe3bd994b3189899d93f1d5a881e725e046fdc2/googletest/test/gtest_test_utils.py#L290)
请注意,这些指的是数字0xFFFFFFFF80000003
(负数)和0x80000003
(正数)以十六进制表示,并且返回代码没有被进一步处理。 (看here https://github.com/google/googletest/blob/2fe3bd994b3189899d93f1d5a881e725e046fdc2/googletest/test/gtest_test_utils.py#L245)
为什么返回码会这样改变呢?
PS:是的,我查过GTEST_OS_WINDOWS
and GTEST_HAS_SEH
在 C++ 代码中是正确的。