Python 在FreeBSD下使用os.WNOHANG时,os.waitpid的状态值是否不可靠?
waitpid文档表示,如果子进程尚未退出,则返回值将是Python 在FreeBSD下使用os.WNOHANG时,os.waitpid的状态值是否不可靠?,python,freebsd,waitpid,Python,Freebsd,Waitpid,waitpid文档表示,如果子进程尚未退出,则返回值将是(0,0),但是在FreeBSD(FreeBSD 10.3-RELEASE-p7)上,有时会返回(0,-512)或(0,-2048)。示例程序: #!/usr/bin/env python import os import sys import time def show_waitpid_results(results): print("results: %s" % (str(results))) print("core
(0,0)
,但是在FreeBSD(FreeBSD 10.3-RELEASE-p7)上,有时会返回(0,-512)
或(0,-2048)
。示例程序:
#!/usr/bin/env python
import os
import sys
import time
def show_waitpid_results(results):
print("results: %s" % (str(results)))
print("core: %r continued: %r stopped: %r signaled: %r exited %r" %
(
os.WCOREDUMP(results[1]),
os.WIFCONTINUED(results[1]),
os.WIFSTOPPED(results[1]),
os.WIFSIGNALED(results[1]),
os.WIFEXITED(results[1]))
)
if os.WIFEXITED(results[1]):
print("exit code: %r" % (os.WEXITSTATUS(results[1])))
if __name__ == '__main__':
try:
pid = os.fork()
if pid:
print("in parent. child pid: %r" % (pid))
while True:
waitpid_result = os.waitpid(pid, os.WNOHANG)
show_waitpid_results(waitpid_result)
if waitpid_result == (0,0) or waitpid_result == (0,-512):
time.sleep(.1)
pass
else:
break
print("parent exiting")
else:
# child
time.sleep(.5)
print("child exiting with exit code 10");
sys.exit(10)
except Exception:
e = sys.exc_info()[1]
print("error: %s"%(e))
sys.exit(20)
osx(Python 2.7.11)和ubuntu(Python 2.7.6)上的正确输出(类似/相同)
不对?FreeBSD(Python 2.7.12)上的行为:
我还看到了FreeBSD下的-2048对-512
当使用
os.WNOHANG
时,可能FreeBSD上的状态值(返回元组中的第二个元素)未正确初始化?我不能依靠waitpid返回(0,0)
?来简单地看一下:是的。如果将WNOHANG作为waitpid的一个选项,并且没有要报告的内容,则返回0,变量kern_exit.c::sys_wait4::status仍然是未初始化的垃圾,但仍然复制到用户的status
参数中。感谢@MarkPlotnick提供的指针。我用a验证了我得到了相同的(垃圾)-512行为。现在我想知道这是一个FreeBSD错误还是Python方面的错误(无效假设?或文档错误?),我认为这是一个FreeBSD错误。我阅读了POSIX标准的页面,虽然系统不需要在*状态下返回任何有意义的内容,但如果waitpid没有报告任何内容,则返回未初始化的内核变量的内容可能会导致信息泄漏。
in parent. child pid: 3196
results: (0, 0)
core: False continued: False stopped: False signaled: False exited True
exit code: 0
results: (0, 0)
core: False continued: False stopped: False signaled: False exited True
exit code: 0
results: (0, 0)
core: False continued: False stopped: False signaled: False exited True
exit code: 0
results: (0, 0)
core: False continued: False stopped: False signaled: False exited True
exit code: 0
results: (0, 0)
core: False continued: False stopped: False signaled: False exited True
exit code: 0
child exiting with exit code 10
results: (0, 0)
core: False continued: False stopped: False signaled: False exited True
exit code: 0
results: (3196, 2560)
core: False continued: False stopped: False signaled: False exited True
exit code: 10
parent exiting
in parent. child pid: 5054
results: (0, -512)
core: False continued: False stopped: False signaled: False exited True
exit code: -2
results: (0, -512)
core: False continued: False stopped: False signaled: False exited True
exit code: -2
results: (0, -512)
core: False continued: False stopped: False signaled: False exited True
exit code: -2
results: (0, -512)
core: False continued: False stopped: False signaled: False exited True
exit code: -2
results: (0, -512)
core: False continued: False stopped: False signaled: False exited True
exit code: -2
child exiting with exit code 10
results: (5054, 2560)
core: False continued: False stopped: False signaled: False exited True
exit code: 10
parent exiting