mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +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