mirror of
https://github.com/python/cpython.git
synced 2025-11-03 19:34:08 +00:00
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).
This commit is contained in:
parent
0c350bfad0
commit
ab034fab03
3 changed files with 56 additions and 8 deletions
|
|
@ -1166,12 +1166,14 @@ Availability: \UNIX.
|
||||||
\end{funcdesc}
|
\end{funcdesc}
|
||||||
|
|
||||||
\begin{funcdesc}{waitpid}{pid, options}
|
\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},
|
Wait for completion of a child process given by process id \var{pid},
|
||||||
and return a tuple containing its process id and exit status
|
and return a tuple containing its process id and exit status
|
||||||
indication (encoded as for \function{wait()}). The semantics of the
|
indication (encoded as for \function{wait()}). The semantics of the
|
||||||
call are affected by the value of the integer \var{options}, which
|
call are affected by the value of the integer \var{options}, which
|
||||||
should be \code{0} for normal operation.
|
should be \code{0} for normal operation.
|
||||||
Availability: \UNIX.
|
|
||||||
|
|
||||||
If \var{pid} is greater than \code{0}, \function{waitpid()} requests
|
If \var{pid} is greater than \code{0}, \function{waitpid()} requests
|
||||||
status information for that specific process. If \var{pid} is
|
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
|
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
|
than \code{-1}, status is requested for any process in the process
|
||||||
group \code{-\var{pid}} (the absolute value of \var{pid}).
|
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}
|
\end{funcdesc}
|
||||||
|
|
||||||
\begin{datadesc}{WNOHANG}
|
\begin{datadesc}{WNOHANG}
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,13 @@ Tests
|
||||||
|
|
||||||
Windows
|
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
|
- New tempfile.TemporaryFile implementation for Windows: this doesn't
|
||||||
need a TemproraryFileWrapper wrapper anymore, and should be immune
|
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
|
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_PIPE 1
|
||||||
#define HAVE_POPEN 1
|
#define HAVE_POPEN 1
|
||||||
#define HAVE_SYSTEM 1
|
#define HAVE_SYSTEM 1
|
||||||
|
#define HAVE_CWAIT 1
|
||||||
#else /* 16-bit Windows */
|
#else /* 16-bit Windows */
|
||||||
#endif /* !MS_WIN32 */
|
#endif /* !MS_WIN32 */
|
||||||
#else /* all other compilers */
|
#else /* all other compilers */
|
||||||
|
|
@ -3333,8 +3334,33 @@ posix_waitpid(PyObject *self, PyObject *args)
|
||||||
else
|
else
|
||||||
return Py_BuildValue("ii", pid, status_i);
|
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
|
#ifdef HAVE_WAIT
|
||||||
static char posix_wait__doc__[] =
|
static char posix_wait__doc__[] =
|
||||||
|
|
@ -5678,7 +5704,7 @@ static PyMethodDef posix_methods[] = {
|
||||||
#ifdef HAVE_WAIT
|
#ifdef HAVE_WAIT
|
||||||
{"wait", posix_wait, METH_VARARGS, posix_wait__doc__},
|
{"wait", posix_wait, METH_VARARGS, posix_wait__doc__},
|
||||||
#endif /* HAVE_WAIT */
|
#endif /* HAVE_WAIT */
|
||||||
#ifdef HAVE_WAITPID
|
#if defined(HAVE_WAITPID) || defined(HAVE_CWAIT)
|
||||||
{"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
|
{"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
|
||||||
#endif /* HAVE_WAITPID */
|
#endif /* HAVE_WAITPID */
|
||||||
#ifdef HAVE_SETSID
|
#ifdef HAVE_SETSID
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue