Commit ab034fab authored by Tim Peters's avatar Tim Peters

Implement os.waitpid() for Windows, in a way that's compatible with Linux

where their capabilities intersect.  Would be nice if people using non-
MSVC compilers (Borland etc) took a whack at doing something similar for
them (this code relies on the MS _cwait function).
parent 0c350bfa
......@@ -1166,12 +1166,14 @@ Availability: \UNIX.
\end{funcdesc}
\begin{funcdesc}{waitpid}{pid, options}
The details of this function differ on \UNIX and Windows.
On \UNIX:
Wait for completion of a child process given by process id \var{pid},
and return a tuple containing its process id and exit status
indication (encoded as for \function{wait()}). The semantics of the
call are affected by the value of the integer \var{options}, which
should be \code{0} for normal operation.
Availability: \UNIX.
If \var{pid} is greater than \code{0}, \function{waitpid()} requests
status information for that specific process. If \var{pid} is
......@@ -1180,6 +1182,19 @@ group of the current process. If \var{pid} is \code{-1}, the request
pertains to any child of the current process. If \var{pid} is less
than \code{-1}, status is requested for any process in the process
group \code{-\var{pid}} (the absolute value of \var{pid}).
On Windows:
Wait for completion of a process given by process id \var{pid},
and return a tuple containing \var{pid},
and its exit status shifted left by 8 bits (shifting makes cross-platform
use of the function easier).
A \var{pid} less than or equal to \code{0} has no special meaning on
Windows, and raises an exception.
The value of integer \var{options} has no effect.
\var{pid} can refer to any process whose id is known, not necessarily a
child process.
The \function{spawn()} functions called with \constant{P_NOWAIT}
return suitable process ids.
\end{funcdesc}
\begin{datadesc}{WNOHANG}
......
......@@ -59,6 +59,13 @@ Tests
Windows
- os.waitpid() is now implemented for Windows, and can be used to block
until a specified process exits. This is similar to, but not exactly
the same as, os.waitpid() on POSIX systems. If you're waiting for
a specific process whose pid was obtained from one of the spawn()
functions, the same Python os.waitpid() code works across platforms.
See the docs for details.
- New tempfile.TemporaryFile implementation for Windows: this doesn't
need a TemproraryFileWrapper wrapper anymore, and should be immune
to a nasty problem: before 2.3, if you got a temp file on Windows, it
......
......@@ -78,6 +78,7 @@ corresponding Unix manual entries for more information on calls.";
#define HAVE_PIPE 1
#define HAVE_POPEN 1
#define HAVE_SYSTEM 1
#define HAVE_CWAIT 1
#else /* 16-bit Windows */
#endif /* !MS_WIN32 */
#else /* all other compilers */
......@@ -3333,8 +3334,33 @@ posix_waitpid(PyObject *self, PyObject *args)
else
return Py_BuildValue("ii", pid, status_i);
}
#endif /* HAVE_WAITPID */
#elif defined(HAVE_CWAIT)
/* MS C has a variant of waitpid() that's usable for most purposes. */
static char posix_waitpid__doc__[] =
"waitpid(pid, options) -> (pid, status << 8)\n"
"Wait for completion of a given process. options is ignored on Windows.";
static PyObject *
posix_waitpid(PyObject *self, PyObject *args)
{
int pid, options;
int status;
if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
return NULL;
Py_BEGIN_ALLOW_THREADS
pid = _cwait(&status, pid, options);
Py_END_ALLOW_THREADS
if (pid == -1)
return posix_error();
else
/* shift the status left a byte so this is more like the
POSIX waitpid */
return Py_BuildValue("ii", pid, status << 8);
}
#endif /* HAVE_WAITPID || HAVE_CWAIT */
#ifdef HAVE_WAIT
static char posix_wait__doc__[] =
......@@ -5678,7 +5704,7 @@ static PyMethodDef posix_methods[] = {
#ifdef HAVE_WAIT
{"wait", posix_wait, METH_VARARGS, posix_wait__doc__},
#endif /* HAVE_WAIT */
#ifdef HAVE_WAITPID
#if defined(HAVE_WAITPID) || defined(HAVE_CWAIT)
{"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
#endif /* HAVE_WAITPID */
#ifdef HAVE_SETSID
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment