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.