How to tell if a forked process is done?

Jeff Epler jepler at unpythonic.net
Wed Sep 24 09:29:28 EDT 2003


os.waitpid() can tell whether a child has exited, and return its status
if so.  It can either enter a blocking wait, or it can return
immediately.

>>> pid = os.spawnv(os.P_NOWAIT, "/bin/sleep", ["sleep", "30"])

With WNOHANG, it returns immediately.  The returned pid is 0 to show
that the process has not exited yet.
>>> os.waitpid(pid, os.WNOHANG)
(0, 0)

Wait for the process to return.  The second number is related to the
exit status and should be managed with os.WEXITSTATUS() etc.
>>> os.waitpid(pid, 0)
(29202, 0)

Waiting again produces a traceback (no danger from another process
created with the same pid)
>>> os.waitpid(pid, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
OSError: [Errno 10] No child processes

If you want to use an argument list instead of an argument string, but
always want to wait for the program to complete, use os.spawn* with
P_WAIT.

Jeff





More information about the Python-list mailing list