Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在FreeBSD下使用os.WNOHANG时,os.waitpid的状态值是否不可靠?_Python_Freebsd_Waitpid - Fatal编程技术网

Python 在FreeBSD下使用os.WNOHANG时,os.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

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: %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