简体   繁体   中英

Is status value from os.waitpid unreliable when os.WNOHANG is used under FreeBSD?

The os.waitpid docs https://docs.python.org/2.7/library/os.html#os.WNOHANG say that if the child process is not yet exited, then the return value will be (0,0) however on FreeBSD (FreeBSD 10.3-RELEASE-p7) sometimes (0,-512) or (0,-2048) is returned. Example program:

#!/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)

Correct output (similar/same) on osx (Python 2.7.11) and ubuntu (Python 2.7.6)

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

Incorrect? behavior on FreeBSD (Python 2.7.12):

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

I have also seen -2048 vs. -512 under FreeBSD.

Maybe the status value (second element in returned tuple) is not initialized properly on FreeBSD when os.WNOHANG is used? Can I not rely on waitpid returning (0,0) ?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM