\section{\module{os} ---
         Miscellaneous operating system interfaces}

\declaremodule{standard}{os}
\modulesynopsis{Miscellaneous operating system interfaces.}


This module provides a more portable way of using operating system
dependent functionality than importing a operating system dependent
built-in module like \refmodule{posix} or \module{nt}.

This module searches for an operating system dependent built-in module like
\module{mac} or \refmodule{posix} and exports the same functions and data
as found there.  The design of all Python's built-in operating system dependent
modules is such that as long as the same functionality is available,
it uses the same interface; for example, the function
\code{os.stat(\var{path})} returns stat information about \var{path} in
the same format (which happens to have originated with the
\POSIX{} interface).

Extensions peculiar to a particular operating system are also
available through the \module{os} module, but using them is of course a
threat to portability!

Note that after the first time \module{os} is imported, there is
\emph{no} performance penalty in using functions from \module{os}
instead of directly from the operating system dependent built-in module,
so there should be \emph{no} reason not to use \module{os}!


% Frank Stajano <fstajano@uk.research.att.com> complained that it
% wasn't clear that the entries described in the subsections were all
% available at the module level (most uses of subsections are
% different); I think this is only a problem for the HTML version,
% where the relationship may not be as clear.
%
\ifhtml
The \module{os} module contains many functions and data values.
The items below and in the following sub-sections are all available
directly from the \module{os} module.
\fi


\begin{excdesc}{error}
This exception is raised when a function returns a system-related
error (not for illegal argument types or other incidental errors).
This is also known as the built-in exception \exception{OSError}.  The
accompanying value is a pair containing the numeric error code from
\cdata{errno} and the corresponding string, as would be printed by the
C function \cfunction{perror()}.  See the module
\refmodule{errno}\refbimodindex{errno}, which contains names for the
error codes defined by the underlying operating system.

When exceptions are classes, this exception carries two attributes,
\member{errno} and \member{strerror}.  The first holds the value of
the C \cdata{errno} variable, and the latter holds the corresponding
error message from \cfunction{strerror()}.  For exceptions that
involve a file system path (such as \function{chdir()} or
\function{unlink()}), the exception instance will contain a third
attribute, \member{filename}, which is the file name passed to the
function.
\end{excdesc}

\begin{datadesc}{name}
The name of the operating system dependent module imported.  The
following names have currently been registered: \code{'posix'},
\code{'nt'}, \code{'mac'}, \code{'os2'}, \code{'ce'},
\code{'java'}, \code{'riscos'}.
\end{datadesc}

\begin{datadesc}{path}
The corresponding operating system dependent standard module for pathname
operations, such as \module{posixpath} or \module{macpath}.  Thus,
given the proper imports, \code{os.path.split(\var{file})} is
equivalent to but more portable than
\code{posixpath.split(\var{file})}.  Note that this is also an
importable module: it may be imported directly as
\refmodule{os.path}.
\end{datadesc}



\subsection{Process Parameters \label{os-procinfo}}

These functions and data items provide information and operate on the
current process and user.

\begin{datadesc}{environ}
A mapping object representing the string environment. For example,
\code{environ['HOME']} is the pathname of your home directory (on some
platforms), and is equivalent to \code{getenv("HOME")} in C.

This mapping is captured the first time the \module{os} module is
imported, typically during Python startup as part of processing
\file{site.py}.  Changes to the environment made after this time are
not reflected in \code{os.environ}, except for changes made by modifying
\code{os.environ} directly.

If the platform supports the \function{putenv()} function, this
mapping may be used to modify the environment as well as query the
environment.  \function{putenv()} will be called automatically when
the mapping is modified.
\note{Calling \function{putenv()} directly does not change
\code{os.environ}, so it's better to modify \code{os.environ}.}
\note{On some platforms, including FreeBSD and Mac OS X, setting
\code{environ} may cause memory leaks.  Refer to the system documentation
for \cfunction{putenv()}.}

If \function{putenv()} is not provided, this mapping may be passed to
the appropriate process-creation functions to cause child processes to
use a modified environment.
\end{datadesc}

\begin{funcdescni}{chdir}{path}
\funclineni{fchdir}{fd}
\funclineni{getcwd}{}
These functions are described in ``Files and Directories'' (section
\ref{os-file-dir}).
\end{funcdescni}

\begin{funcdesc}{ctermid}{}
Return the filename corresponding to the controlling terminal of the
process.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{getegid}{}
Return the effective group id of the current process.  This
corresponds to the `set id' bit on the file being executed in the
current process.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{geteuid}{}
\index{user!effective id}
Return the current process' effective user id.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{getgid}{}
\index{process!group}
Return the real group id of the current process.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{getgroups}{}
Return list of supplemental group ids associated with the current
process.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{getlogin}{}
Return the name of the user logged in on the controlling terminal of
the process.  For most purposes, it is more useful to use the
environment variable \envvar{LOGNAME} to find out who the user is,
or \code{pwd.getpwuid(os.getuid())[0]} to get the login name
of the currently effective user ID.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{getpgid}{pid}
Return the process group id of the process with process id \var{pid}.
If \var{pid} is 0, the process group id of the current process is
returned. Availability: \UNIX.
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{getpgrp}{}
\index{process!group}
Return the id of the current process group.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{getpid}{}
\index{process!id}
Return the current process id.
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{getppid}{}
\index{process!id of parent}
Return the parent's process id.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{getuid}{}
\index{user!id}
Return the current process' user id.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{getenv}{varname\optional{, value}}
Return the value of the environment variable \var{varname} if it
exists, or \var{value} if it doesn't.  \var{value} defaults to
\code{None}.
Availability: most flavors of \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{putenv}{varname, value}
\index{environment variables!setting}
Set the environment variable named \var{varname} to the string
\var{value}.  Such changes to the environment affect subprocesses
started with \function{os.system()}, \function{popen()} or
\function{fork()} and \function{execv()}.
Availability: most flavors of \UNIX, Windows.

\note{On some platforms, including FreeBSD and Mac OS X,
setting \code{environ} may cause memory leaks.
Refer to the system documentation for putenv.}

When \function{putenv()} is
supported, assignments to items in \code{os.environ} are automatically
translated into corresponding calls to \function{putenv()}; however,
calls to \function{putenv()} don't update \code{os.environ}, so it is
actually preferable to assign to items of \code{os.environ}.
\end{funcdesc}

\begin{funcdesc}{setegid}{egid}
Set the current process's effective group id.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{seteuid}{euid}
Set the current process's effective user id.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{setgid}{gid}
Set the current process' group id.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{setgroups}{groups}
Set the list of supplemental group ids associated with the current
process to \var{groups}. \var{groups} must be a sequence, and each
element must be an integer identifying a group. This operation is
typical available only to the superuser.
Availability: \UNIX.
\versionadded{2.2}
\end{funcdesc}

\begin{funcdesc}{setpgrp}{}
Calls the system call \cfunction{setpgrp()} or \cfunction{setpgrp(0,
0)} depending on which version is implemented (if any).  See the
\UNIX{} manual for the semantics.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{setpgid}{pid, pgrp} Calls the system call
\cfunction{setpgid()} to set the process group id of the process with
id \var{pid} to the process group with id \var{pgrp}.  See the \UNIX{}
manual for the semantics.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{setreuid}{ruid, euid}
Set the current process's real and effective user ids.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{setregid}{rgid, egid}
Set the current process's real and effective group ids.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{getsid}{pid}
Calls the system call \cfunction{getsid()}.  See the \UNIX{} manual
for the semantics.
Availability: \UNIX. \versionadded{2.4}
\end{funcdesc}

\begin{funcdesc}{setsid}{}
Calls the system call \cfunction{setsid()}.  See the \UNIX{} manual
for the semantics.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{setuid}{uid}
\index{user!id, setting}
Set the current process' user id.
Availability: \UNIX.
\end{funcdesc}

% placed in this section since it relates to errno.... a little weak
\begin{funcdesc}{strerror}{code}
Return the error message corresponding to the error code in
\var{code}.
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{umask}{mask}
Set the current numeric umask and returns the previous umask.
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{uname}{}
Return a 5-tuple containing information identifying the current
operating system.  The tuple contains 5 strings:
\code{(\var{sysname}, \var{nodename}, \var{release}, \var{version},
\var{machine})}.  Some systems truncate the nodename to 8
characters or to the leading component; a better way to get the
hostname is \function{socket.gethostname()}
\withsubitem{(in module socket)}{\ttindex{gethostname()}}
or even
\withsubitem{(in module socket)}{\ttindex{gethostbyaddr()}}
\code{socket.gethostbyaddr(socket.gethostname())}.
Availability: recent flavors of \UNIX.
\end{funcdesc}



\subsection{File Object Creation \label{os-newstreams}}

These functions create new file objects.


\begin{funcdesc}{fdopen}{fd\optional{, mode\optional{, bufsize}}}
Return an open file object connected to the file descriptor \var{fd}.
\index{I/O control!buffering}
The \var{mode} and \var{bufsize} arguments have the same meaning as
the corresponding arguments to the built-in \function{open()}
function.
Availability: Macintosh, \UNIX, Windows.

\versionchanged[When specified, the \var{mode} argument must now start
  with one of the letters \character{r}, \character{w}, or \character{a},
  otherwise a \exception{ValueError} is raised]{2.3}
\end{funcdesc}

\begin{funcdesc}{popen}{command\optional{, mode\optional{, bufsize}}}
Open a pipe to or from \var{command}.  The return value is an open
file object connected to the pipe, which can be read or written
depending on whether \var{mode} is \code{'r'} (default) or \code{'w'}.
The \var{bufsize} argument has the same meaning as the corresponding
argument to the built-in \function{open()} function.  The exit status of
the command (encoded in the format specified for \function{wait()}) is
available as the return value of the \method{close()} method of the file
object, except that when the exit status is zero (termination without
errors), \code{None} is returned.
Availability: \UNIX, Windows.

\versionchanged[This function worked unreliably under Windows in
  earlier versions of Python.  This was due to the use of the
  \cfunction{_popen()} function from the libraries provided with
  Windows.  Newer versions of Python do not use the broken
  implementation from the Windows libraries]{2.0}
\end{funcdesc}

\begin{funcdesc}{tmpfile}{}
Return a new file object opened in update mode (\samp{w+b}).  The file
has no directory entries associated with it and will be automatically
deleted once there are no file descriptors for the file.
Availability: \UNIX, Windows.
\end{funcdesc}


For each of these \function{popen()} variants, if \var{bufsize} is
specified, it specifies the buffer size for the I/O pipes.
\var{mode}, if provided, should be the string \code{'b'} or
\code{'t'}; on Windows this is needed to determine whether the file
objects should be opened in binary or text mode.  The default value
for \var{mode} is \code{'t'}.

These methods do not make it possible to retrieve the return code from
the child processes.  The only way to control the input and output
streams and also retrieve the return codes is to use the
\class{Popen3} and \class{Popen4} classes from the \refmodule{popen2}
module; these are only available on \UNIX.

For a discussion of possible deadlock conditions related to the use
of these functions, see ``\ulink{Flow Control
Issues}{popen2-flow-control.html}''
(section~\ref{popen2-flow-control}).

\begin{funcdesc}{popen2}{cmd\optional{, mode\optional{, bufsize}}}
Executes \var{cmd} as a sub-process.  Returns the file objects
\code{(\var{child_stdin}, \var{child_stdout})}.
Availability: \UNIX, Windows.
\versionadded{2.0}
\end{funcdesc}

\begin{funcdesc}{popen3}{cmd\optional{, mode\optional{, bufsize}}}
Executes \var{cmd} as a sub-process.  Returns the file objects
\code{(\var{child_stdin}, \var{child_stdout}, \var{child_stderr})}.
Availability: \UNIX, Windows.
\versionadded{2.0}
\end{funcdesc}

\begin{funcdesc}{popen4}{cmd\optional{, mode\optional{, bufsize}}}
Executes \var{cmd} as a sub-process.  Returns the file objects
\code{(\var{child_stdin}, \var{child_stdout_and_stderr})}.

(Note that \code{\var{child_stdin}, \var{child_stdout}, and
\var{child_stderr}} are named from the point of view of the child
process, i.e. \var{child_stdin} is the child's standard input.)

Availability: \UNIX, Windows.
\versionadded{2.0}
\end{funcdesc}

This functionality is also available in the \refmodule{popen2} module
using functions of the same names, but the return values of those
functions have a different order.


\subsection{File Descriptor Operations \label{os-fd-ops}}

These functions operate on I/O streams referred to
using file descriptors.


\begin{funcdesc}{close}{fd}
Close file descriptor \var{fd}.
Availability: Macintosh, \UNIX, Windows.

\begin{notice}
This function is intended for low-level I/O and must be applied
to a file descriptor as returned by \function{open()} or
\function{pipe()}.  To close a ``file object'' returned by the
built-in function \function{open()} or by \function{popen()} or
\function{fdopen()}, use its \method{close()} method.
\end{notice}
\end{funcdesc}

\begin{funcdesc}{dup}{fd}
Return a duplicate of file descriptor \var{fd}.
Availability: Macintosh, \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{dup2}{fd, fd2}
Duplicate file descriptor \var{fd} to \var{fd2}, closing the latter
first if necessary.
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{fdatasync}{fd}
Force write of file with filedescriptor \var{fd} to disk.
Does not force update of metadata.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{fpathconf}{fd, name}
Return system configuration information relevant to an open file.
\var{name} specifies the configuration value to retrieve; it may be a
string which is the name of a defined system value; these names are
specified in a number of standards (\POSIX.1, \UNIX{} 95, \UNIX{} 98, and
others).  Some platforms define additional names as well.  The names
known to the host operating system are given in the
\code{pathconf_names} dictionary.  For configuration variables not
included in that mapping, passing an integer for \var{name} is also
accepted.
Availability: \UNIX.

If \var{name} is a string and is not known, \exception{ValueError} is
raised.  If a specific value for \var{name} is not supported by the
host system, even if it is included in \code{pathconf_names}, an
\exception{OSError} is raised with \constant{errno.EINVAL} for the
error number.
\end{funcdesc}

\begin{funcdesc}{fstat}{fd}
Return status for file descriptor \var{fd}, like \function{stat()}.
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{fstatvfs}{fd}
Return information about the filesystem containing the file associated
with file descriptor \var{fd}, like \function{statvfs()}.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{fsync}{fd}
Force write of file with filedescriptor \var{fd} to disk.  On \UNIX,
this calls the native \cfunction{fsync()} function; on Windows, the
MS \cfunction{_commit()} function.

If you're starting with a Python file object \var{f}, first do
\code{\var{f}.flush()}, and then do \code{os.fsync(\var{f}.fileno())},
to ensure that all internal buffers associated with \var{f} are written
to disk.
Availability: \UNIX, and Windows starting in 2.2.3.
\end{funcdesc}

\begin{funcdesc}{ftruncate}{fd, length}
Truncate the file corresponding to file descriptor \var{fd},
so that it is at most \var{length} bytes in size.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{isatty}{fd}
Return \code{True} if the file descriptor \var{fd} is open and
connected to a tty(-like) device, else \code{False}.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{lseek}{fd, pos, how}
Set the current position of file descriptor \var{fd} to position
\var{pos}, modified by \var{how}: \code{0} to set the position
relative to the beginning of the file; \code{1} to set it relative to
the current position; \code{2} to set it relative to the end of the
file.
Availability: Macintosh, \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{open}{file, flags\optional{, mode}}
Open the file \var{file} and set various flags according to
\var{flags} and possibly its mode according to \var{mode}.
The default \var{mode} is \code{0777} (octal), and the current umask
value is first masked out.  Return the file descriptor for the newly
opened file.
Availability: Macintosh, \UNIX, Windows.

For a description of the flag and mode values, see the C run-time
documentation; flag constants (like \constant{O_RDONLY} and
\constant{O_WRONLY}) are defined in this module too (see below).

\begin{notice}
This function is intended for low-level I/O.  For normal usage,
use the built-in function \function{open()}, which returns a ``file
object'' with \method{read()} and \method{write()} methods (and many
more).
\end{notice}
\end{funcdesc}

\begin{funcdesc}{openpty}{}
Open a new pseudo-terminal pair. Return a pair of file descriptors
\code{(\var{master}, \var{slave})} for the pty and the tty,
respectively. For a (slightly) more portable approach, use the
\refmodule{pty}\refstmodindex{pty} module.
Availability: Some flavors of \UNIX.
\end{funcdesc}

\begin{funcdesc}{pipe}{}
Create a pipe.  Return a pair of file descriptors \code{(\var{r},
\var{w})} usable for reading and writing, respectively.
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{read}{fd, n}
Read at most \var{n} bytes from file descriptor \var{fd}.
Return a string containing the bytes read.  If the end of the file
referred to by \var{fd} has been reached, an empty string is
returned.
Availability: Macintosh, \UNIX, Windows.

\begin{notice}
This function is intended for low-level I/O and must be applied
to a file descriptor as returned by \function{open()} or
\function{pipe()}.  To read a ``file object'' returned by the
built-in function \function{open()} or by \function{popen()} or
\function{fdopen()}, or \code{sys.stdin}, use its
\method{read()} or \method{readline()} methods.
\end{notice}
\end{funcdesc}

\begin{funcdesc}{tcgetpgrp}{fd}
Return the process group associated with the terminal given by
\var{fd} (an open file descriptor as returned by \function{open()}).
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{tcsetpgrp}{fd, pg}
Set the process group associated with the terminal given by
\var{fd} (an open file descriptor as returned by \function{open()})
to \var{pg}.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{ttyname}{fd}
Return a string which specifies the terminal device associated with
file-descriptor \var{fd}.  If \var{fd} is not associated with a terminal
device, an exception is raised.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{write}{fd, str}
Write the string \var{str} to file descriptor \var{fd}.
Return the number of bytes actually written.
Availability: Macintosh, \UNIX, Windows.

\begin{notice}
This function is intended for low-level I/O and must be applied
to a file descriptor as returned by \function{open()} or
\function{pipe()}.  To write a ``file object'' returned by the
built-in function \function{open()} or by \function{popen()} or
\function{fdopen()}, or \code{sys.stdout} or \code{sys.stderr}, use
its \method{write()} method.
\end{notice}
\end{funcdesc}


The following data items are available for use in constructing the
\var{flags} parameter to the \function{open()} function.

\begin{datadesc}{O_RDONLY}
\dataline{O_WRONLY}
\dataline{O_RDWR}
\dataline{O_APPEND}
\dataline{O_CREAT}
\dataline{O_EXCL}
\dataline{O_TRUNC}
Options for the \var{flag} argument to the \function{open()} function.
These can be bit-wise OR'd together.
Availability: Macintosh, \UNIX, Windows.
\end{datadesc}

\begin{datadesc}{O_DSYNC}
\dataline{O_RSYNC}
\dataline{O_SYNC}
\dataline{O_NDELAY}
\dataline{O_NONBLOCK}
\dataline{O_NOCTTY}
More options for the \var{flag} argument to the \function{open()} function.
Availability: Macintosh, \UNIX.
\end{datadesc}

\begin{datadesc}{O_BINARY}
Option for the \var{flag} argument to the \function{open()} function.
This can be bit-wise OR'd together with those listed above.
Availability: Macintosh, Windows.
% XXX need to check on the availability of this one.
\end{datadesc}

\begin{datadesc}{O_NOINHERIT}
\dataline{O_SHORT_LIVED}
\dataline{O_TEMPORARY}
\dataline{O_RANDOM}
\dataline{O_SEQUENTIAL}
\dataline{O_TEXT}
Options for the \var{flag} argument to the \function{open()} function.
These can be bit-wise OR'd together.
Availability: Windows.
\end{datadesc}

\subsection{Files and Directories \label{os-file-dir}}

\begin{funcdesc}{access}{path, mode}
Use the real uid/gid to test for access to \var{path}.  Note that most
operations will use the effective uid/gid, therefore this routine can
be used in a suid/sgid environment to test if the invoking user has the
specified access to \var{path}.  \var{mode} should be \constant{F_OK}
to test the existence of \var{path}, or it can be the inclusive OR of
one or more of \constant{R_OK}, \constant{W_OK}, and \constant{X_OK} to
test permissions.  Return \constant{True} if access is allowed,
\constant{False} if not.
See the \UNIX{} man page \manpage{access}{2} for more information.
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{datadesc}{F_OK}
  Value to pass as the \var{mode} parameter of \function{access()} to
  test the existence of \var{path}.
\end{datadesc}

\begin{datadesc}{R_OK}
  Value to include in the \var{mode} parameter of \function{access()}
  to test the readability of \var{path}.
\end{datadesc}

\begin{datadesc}{W_OK}
  Value to include in the \var{mode} parameter of \function{access()}
  to test the writability of \var{path}.
\end{datadesc}

\begin{datadesc}{X_OK}
  Value to include in the \var{mode} parameter of \function{access()}
  to determine if \var{path} can be executed.
\end{datadesc}

\begin{funcdesc}{chdir}{path}
\index{directory!changing}
Change the current working directory to \var{path}.
Availability: Macintosh, \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{fchdir}{fd}
Change the current working directory to the directory represented by
the file descriptor \var{fd}.  The descriptor must refer to an opened
directory, not an open file.
Availability: \UNIX.
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{getcwd}{}
Return a string representing the current working directory.
Availability: Macintosh, \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{getcwdu}{}
Return a Unicode object representing the current working directory.
Availability: \UNIX, Windows.
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{chroot}{path}
Change the root directory of the current process to \var{path}.
Availability: \UNIX.
\versionadded{2.2}
\end{funcdesc}

\begin{funcdesc}{chmod}{path, mode}
Change the mode of \var{path} to the numeric \var{mode}.
\var{mode} may take one of the following values
(as defined in the \module{stat} module):
\begin{itemize}
  \item \code{S_ISUID}
  \item \code{S_ISGID}
  \item \code{S_ENFMT}
  \item \code{S_ISVTX}
  \item \code{S_IREAD}
  \item \code{S_IWRITE}
  \item \code{S_IEXEC}
  \item \code{S_IRWXU}
  \item \code{S_IRUSR}
  \item \code{S_IWUSR}
  \item \code{S_IXUSR}
  \item \code{S_IRWXG}
  \item \code{S_IRGRP}
  \item \code{S_IWGRP}
  \item \code{S_IXGRP}
  \item \code{S_IRWXO}
  \item \code{S_IROTH}
  \item \code{S_IWOTH}
  \item \code{S_IXOTH}
\end{itemize}
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{chown}{path, uid, gid}
Change the owner and group id of \var{path} to the numeric \var{uid}
and \var{gid}.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{lchown}{path, uid, gid}
Change the owner and group id of \var{path} to the numeric \var{uid}
and gid. This function will not follow symbolic links.
Availability: \UNIX.
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{link}{src, dst}
Create a hard link pointing to \var{src} named \var{dst}.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{listdir}{path}
Return a list containing the names of the entries in the directory.
The list is in arbitrary order.  It does not include the special
entries \code{'.'} and \code{'..'} even if they are present in the
directory.
Availability: Macintosh, \UNIX, Windows.

\versionchanged[On Windows NT/2k/XP and Unix, if \var{path} is a Unicode
object, the result will be a list of Unicode objects.]{2.3}
\end{funcdesc}

\begin{funcdesc}{lstat}{path}
Like \function{stat()}, but do not follow symbolic links.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{mkfifo}{path\optional{, mode}}
Create a FIFO (a named pipe) named \var{path} with numeric mode
\var{mode}.  The default \var{mode} is \code{0666} (octal).  The current
umask value is first masked out from the mode.
Availability: \UNIX.

FIFOs are pipes that can be accessed like regular files.  FIFOs exist
until they are deleted (for example with \function{os.unlink()}).
Generally, FIFOs are used as rendezvous between ``client'' and
``server'' type processes: the server opens the FIFO for reading, and
the client opens it for writing.  Note that \function{mkfifo()}
doesn't open the FIFO --- it just creates the rendezvous point.
\end{funcdesc}

\begin{funcdesc}{mknod}{path\optional{, mode=0600, device}}
Create a filesystem node (file, device special file or named pipe)
named filename. \var{mode} specifies both the permissions to use and
the type of node to be created, being combined (bitwise OR) with one
of S_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO (those constants are
available in \module{stat}). For S_IFCHR and S_IFBLK, \var{device}
defines the newly created device special file (probably using
\function{os.makedev()}), otherwise it is ignored.
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{major}{device}
Extracts a device major number from a raw device number.
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{minor}{device}
Extracts a device minor number from a raw device number.
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{makedev}{major, minor}
Composes a raw device number from the major and minor device numbers.
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{mkdir}{path\optional{, mode}}
Create a directory named \var{path} with numeric mode \var{mode}.
The default \var{mode} is \code{0777} (octal).  On some systems,
\var{mode} is ignored.  Where it is used, the current umask value is
first masked out.
Availability: Macintosh, \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{makedirs}{path\optional{, mode}}
Recursive directory creation function.\index{directory!creating}
\index{UNC paths!and \function{os.makedirs()}}
Like \function{mkdir()},
but makes all intermediate-level directories needed to contain the
leaf directory.  Throws an \exception{error} exception if the leaf
directory already exists or cannot be created.  The default \var{mode}
is \code{0777} (octal).  This function does not properly handle UNC
paths (only relevant on Windows systems; Universal Naming Convention
paths are those that use the `\code{\e\e host\e path}' syntax).
\versionadded{1.5.2}
\end{funcdesc}

\begin{funcdesc}{pathconf}{path, name}
Return system configuration information relevant to a named file.
\var{name} specifies the configuration value to retrieve; it may be a
string which is the name of a defined system value; these names are
specified in a number of standards (\POSIX.1, \UNIX{} 95, \UNIX{} 98, and
others).  Some platforms define additional names as well.  The names
known to the host operating system are given in the
\code{pathconf_names} dictionary.  For configuration variables not
included in that mapping, passing an integer for \var{name} is also
accepted.
Availability: \UNIX.

If \var{name} is a string and is not known, \exception{ValueError} is
raised.  If a specific value for \var{name} is not supported by the
host system, even if it is included in \code{pathconf_names}, an
\exception{OSError} is raised with \constant{errno.EINVAL} for the
error number.
\end{funcdesc}

\begin{datadesc}{pathconf_names}
Dictionary mapping names accepted by \function{pathconf()} and
\function{fpathconf()} to the integer values defined for those names
by the host operating system.  This can be used to determine the set
of names known to the system.
Availability: \UNIX.
\end{datadesc}

\begin{funcdesc}{readlink}{path}
Return a string representing the path to which the symbolic link
points.  The result may be either an absolute or relative pathname; if
it is relative, it may be converted to an absolute pathname using
\code{os.path.join(os.path.dirname(\var{path}), \var{result})}.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{remove}{path}
Remove the file \var{path}.  If \var{path} is a directory,
\exception{OSError} is raised; see \function{rmdir()} below to remove
a directory.  This is identical to the \function{unlink()} function
documented below.  On Windows, attempting to remove a file that is in
use causes an exception to be raised; on \UNIX, the directory entry is
removed but the storage allocated to the file is not made available
until the original file is no longer in use.
Availability: Macintosh, \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{removedirs}{path}
\index{directory!deleting}
Removes directories recursively.  Works like
\function{rmdir()} except that, if the leaf directory is
successfully removed, directories corresponding to rightmost path
segments will be pruned way until either the whole path is consumed or
an error is raised (which is ignored, because it generally means that
a parent directory is not empty).  Throws an \exception{error}
exception if the leaf directory could not be successfully removed.
\versionadded{1.5.2}
\end{funcdesc}

\begin{funcdesc}{rename}{src, dst}
Rename the file or directory \var{src} to \var{dst}.  If \var{dst} is
a directory, \exception{OSError} will be raised.  On \UNIX, if
\var{dst} exists and is a file, it will be removed silently if the
user has permission.  The operation may fail on some \UNIX{} flavors
if \var{src} and \var{dst} are on different filesystems.  If
successful, the renaming will be an atomic operation (this is a
\POSIX{} requirement).  On Windows, if \var{dst} already exists,
\exception{OSError} will be raised even if it is a file; there may be
no way to implement an atomic rename when \var{dst} names an existing
file.
Availability: Macintosh, \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{renames}{old, new}
Recursive directory or file renaming function.
Works like \function{rename()}, except creation of any intermediate
directories needed to make the new pathname good is attempted first.
After the rename, directories corresponding to rightmost path segments
of the old name will be pruned away using \function{removedirs()}.
\versionadded{1.5.2}

\begin{notice}
This function can fail with the new directory structure made if
you lack permissions needed to remove the leaf directory or file.
\end{notice}
\end{funcdesc}

\begin{funcdesc}{rmdir}{path}
Remove the directory \var{path}.
Availability: Macintosh, \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{stat}{path}
Perform a \cfunction{stat()} system call on the given path.  The
return value is an object whose attributes correspond to the members of
the \ctype{stat} structure, namely:
\member{st_mode} (protection bits),
\member{st_ino} (inode number),
\member{st_dev} (device),
\member{st_nlink} (number of hard links),
\member{st_uid} (user ID of owner),
\member{st_gid} (group ID of owner),
\member{st_size} (size of file, in bytes),
\member{st_atime} (time of most recent access),
\member{st_mtime} (time of most recent content modification),
\member{st_ctime}
(platform dependent; time of most recent metadata change on \UNIX, or
the time of creation on Windows).

\versionchanged [If \function{stat_float_times} returns true, the time
values are floats, measuring seconds. Fractions of a second may be
reported if the system supports that. On Mac OS, the times are always
floats. See \function{stat_float_times} for further discussion. ]{2.3}

On some Unix systems (such as Linux), the following attributes may
also be available:
\member{st_blocks} (number of blocks allocated for file),
\member{st_blksize} (filesystem blocksize),
\member{st_rdev} (type of device if an inode device).

On Mac OS systems, the following attributes may also be available:
\member{st_rsize},
\member{st_creator},
\member{st_type}.

On RISCOS systems, the following attributes are also available:
\member{st_ftype} (file type),
\member{st_attrs} (attributes),
\member{st_obtype} (object type).

For backward compatibility, the return value of \function{stat()} is
also accessible as a tuple of at least 10 integers giving the most
important (and portable) members of the \ctype{stat} structure, in the
order
\member{st_mode},
\member{st_ino},
\member{st_dev},
\member{st_nlink},
\member{st_uid},
\member{st_gid},
\member{st_size},
\member{st_atime},
\member{st_mtime},
\member{st_ctime}.
More items may be added at the end by some implementations.
The standard module \refmodule{stat}\refstmodindex{stat} defines
functions and constants that are useful for extracting information
from a \ctype{stat} structure.
(On Windows, some items are filled with dummy values.)
Availability: Macintosh, \UNIX, Windows.

\versionchanged
[Added access to values as attributes of the returned object]{2.2}
\end{funcdesc}

\begin{funcdesc}{stat_float_times}{\optional{newvalue}}
Determine whether \class{stat_result} represents time stamps as float
objects.  If newval is True, future calls to stat() return floats, if
it is False, future calls return ints.  If newval is omitted, return
the current setting.

For compatibility with older Python versions, accessing
\class{stat_result} as a tuple always returns integers. For
compatibility with Python 2.2, accessing the time stamps by field name
also returns integers. Applications that want to determine the
fractions of a second in a time stamp can use this function to have
time stamps represented as floats. Whether they will actually observe
non-zero fractions depends on the system.

Future Python releases will change the default of this setting;
applications that cannot deal with floating point time stamps can then
use this function to turn the feature off.

It is recommended that this setting is only changed at program startup
time in the \var{__main__} module; libraries should never change this
setting. If an application uses a library that works incorrectly if
floating point time stamps are processed, this application should turn
the feature off until the library has been corrected.

\end{funcdesc}

\begin{funcdesc}{statvfs}{path}
Perform a \cfunction{statvfs()} system call on the given path.  The
return value is an object whose attributes describe the filesystem on
the given path, and correspond to the members of the
\ctype{statvfs} structure, namely:
\member{f_frsize},
\member{f_blocks},
\member{f_bfree},
\member{f_bavail},
\member{f_files},
\member{f_ffree},
\member{f_favail},
\member{f_flag},
\member{f_namemax}.
Availability: \UNIX.

For backward compatibility, the return value is also accessible as a
tuple whose values correspond to the attributes, in the order given above.
The standard module \refmodule{statvfs}\refstmodindex{statvfs}
defines constants that are useful for extracting information
from a \ctype{statvfs} structure when accessing it as a sequence; this
remains useful when writing code that needs to work with versions of
Python that don't support accessing the fields as attributes.

\versionchanged
[Added access to values as attributes of the returned object]{2.2}
\end{funcdesc}

\begin{funcdesc}{symlink}{src, dst}
Create a symbolic link pointing to \var{src} named \var{dst}.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{tempnam}{\optional{dir\optional{, prefix}}}
Return a unique path name that is reasonable for creating a temporary
file.  This will be an absolute path that names a potential directory
entry in the directory \var{dir} or a common location for temporary
files if \var{dir} is omitted or \code{None}.  If given and not
\code{None}, \var{prefix} is used to provide a short prefix to the
filename.  Applications are responsible for properly creating and
managing files created using paths returned by \function{tempnam()};
no automatic cleanup is provided.
On \UNIX, the environment variable \envvar{TMPDIR} overrides
\var{dir}, while on Windows the \envvar{TMP} is used.  The specific
behavior of this function depends on the C library implementation;
some aspects are underspecified in system documentation.
\warning{Use of \function{tempnam()} is vulnerable to symlink attacks;
consider using \function{tmpfile()} instead.}
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{tmpnam}{}
Return a unique path name that is reasonable for creating a temporary
file.  This will be an absolute path that names a potential directory
entry in a common location for temporary files.  Applications are
responsible for properly creating and managing files created using
paths returned by \function{tmpnam()}; no automatic cleanup is
provided.
\warning{Use of \function{tmpnam()} is vulnerable to symlink attacks;
consider using \function{tmpfile()} instead.}
Availability: \UNIX, Windows.  This function probably shouldn't be used
on Windows, though:  Microsoft's implementation of \function{tmpnam()}
always creates a name in the root directory of the current drive, and
that's generally a poor location for a temp file (depending on
privileges, you may not even be able to open a file using this name).
\end{funcdesc}

\begin{datadesc}{TMP_MAX}
The maximum number of unique names that \function{tmpnam()} will
generate before reusing names.
\end{datadesc}

\begin{funcdesc}{unlink}{path}
Remove the file \var{path}.  This is the same function as
\function{remove()}; the \function{unlink()} name is its traditional
\UNIX{} name.
Availability: Macintosh, \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{utime}{path, times}
Set the access and modified times of the file specified by \var{path}.
If \var{times} is \code{None}, then the file's access and modified
times are set to the current time.  Otherwise, \var{times} must be a
2-tuple of numbers, of the form \code{(\var{atime}, \var{mtime})}
which is used to set the access and modified times, respectively.
\versionchanged[Added support for \code{None} for \var{times}]{2.0}
Availability: Macintosh, \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{walk}{top\optional{, topdown\code{=True}
                       \optional{, onerror\code{=None}}}}
\index{directory!walking}
\index{directory!traversal}
\function{walk()} generates the file names in a directory tree, by
walking the tree either top down or bottom up.
For each directory in the tree rooted at directory \var{top} (including
\var{top} itself), it yields a 3-tuple
\code{(\var{dirpath}, \var{dirnames}, \var{filenames})}.

\var{dirpath} is a string, the path to the directory.  \var{dirnames} is
a list of the names of the subdirectories in \var{dirpath}
(excluding \code{'.'} and \code{'..'}).  \var{filenames} is a list of
the names of the non-directory files in \var{dirpath}.  Note that the
names in the lists contain no path components.  To get a full
path (which begins with \var{top}) to a file or directory in
\var{dirpath}, do \code{os.path.join(\var{dirpath}, \var{name})}.

If optional argument \var{topdown} is true or not specified, the triple
for a directory is generated before the triples for any of its
subdirectories (directories are generated top down).  If \var{topdown} is
false, the triple for a directory is generated after the triples for all
of its subdirectories (directories are generated bottom up).

When \var{topdown} is true, the caller can modify the \var{dirnames} list
in-place (perhaps using \keyword{del} or slice assignment), and
\function{walk()} will only recurse into the subdirectories whose names
remain in \var{dirnames}; this can be used to prune the search,
impose a specific order of visiting, or even to inform \function{walk()}
about directories the caller creates or renames before it resumes
\function{walk()} again.  Modifying \var{dirnames} when \var{topdown} is
false is ineffective, because in bottom-up mode the directories in
\var{dirnames} are generated before \var{dirnames} itself is generated.

By default errors from the \code{os.listdir()} call are ignored.  If
optional argument \var{onerror} is specified, it should be a function;
it will be called with one argument, an os.error instance.  It can
report the error to continue with the walk, or raise the exception
to abort the walk.  Note that the filename is available as the
\code{filename} attribute of the exception object.

\begin{notice}
If you pass a relative pathname, don't change the current working
directory between resumptions of \function{walk()}.  \function{walk()}
never changes the current directory, and assumes that its caller
doesn't either.
\end{notice}

\begin{notice}
On systems that support symbolic links, links to subdirectories appear
in \var{dirnames} lists, but \function{walk()} will not visit them
(infinite loops are hard to avoid when following symbolic links).
To visit linked directories, you can identify them with
\code{os.path.islink(\var{path})}, and invoke \code{walk(\var{path})}
on each directly.
\end{notice}

This example displays the number of bytes taken by non-directory files
in each directory under the starting directory, except that it doesn't
look under any CVS subdirectory:

\begin{verbatim}
import os
from os.path import join, getsize
for root, dirs, files in os.walk('python/Lib/email'):
    print root, "consumes",
    print sum([getsize(join(root, name)) for name in files]),
    print "bytes in", len(files), "non-directory files"
    if 'CVS' in dirs:
        dirs.remove('CVS')  # don't visit CVS directories
\end{verbatim}

In the next example, walking the tree bottom up is essential:
\function{rmdir()} doesn't allow deleting a directory before the
directory is empty:

\begin{verbatim}
import os
from os.path import join
# Delete everything reachable from the directory named in 'top'.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
for root, dirs, files in os.walk(top, topdown=False):
    for name in files:
        os.remove(join(root, name))
    for name in dirs:
        os.rmdir(join(root, name))
\end{verbatim}

\versionadded{2.3}
\end{funcdesc}

\subsection{Process Management \label{os-process}}

These functions may be used to create and manage processes.

The various \function{exec*()} functions take a list of arguments for
the new program loaded into the process.  In each case, the first of
these arguments is passed to the new program as its own name rather
than as an argument a user may have typed on a command line.  For the
C programmer, this is the \code{argv[0]} passed to a program's
\cfunction{main()}.  For example, \samp{os.execv('/bin/echo', ['foo',
'bar'])} will only print \samp{bar} on standard output; \samp{foo}
will seem to be ignored.


\begin{funcdesc}{abort}{}
Generate a \constant{SIGABRT} signal to the current process.  On
\UNIX, the default behavior is to produce a core dump; on Windows, the
process immediately returns an exit code of \code{3}.  Be aware that
programs which use \function{signal.signal()} to register a handler
for \constant{SIGABRT} will behave differently.
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{execl}{path, arg0, arg1, \moreargs}
\funcline{execle}{path, arg0, arg1, \moreargs, env}
\funcline{execlp}{file, arg0, arg1, \moreargs}
\funcline{execlpe}{file, arg0, arg1, \moreargs, env}
\funcline{execv}{path, args}
\funcline{execve}{path, args, env}
\funcline{execvp}{file, args}
\funcline{execvpe}{file, args, env}
These functions all execute a new program, replacing the current
process; they do not return.  On \UNIX, the new executable is loaded
into the current process, and will have the same process ID as the
caller.  Errors will be reported as \exception{OSError} exceptions.

The \character{l} and \character{v} variants of the
\function{exec*()} functions differ in how command-line arguments are
passed.  The \character{l} variants are perhaps the easiest to work
with if the number of parameters is fixed when the code is written;
the individual parameters simply become additional parameters to the
\function{execl*()} functions.  The \character{v} variants are good
when the number of parameters is variable, with the arguments being
passed in a list or tuple as the \var{args} parameter.  In either
case, the arguments to the child process must start with the name of
the command being run.

The variants which include a \character{p} near the end
(\function{execlp()}, \function{execlpe()}, \function{execvp()},
and \function{execvpe()}) will use the \envvar{PATH} environment
variable to locate the program \var{file}.  When the environment is
being replaced (using one of the \function{exec*e()} variants,
discussed in the next paragraph), the
new environment is used as the source of the \envvar{PATH} variable.
The other variants, \function{execl()}, \function{execle()},
\function{execv()}, and \function{execve()}, will not use the
\envvar{PATH} variable to locate the executable; \var{path} must
contain an appropriate absolute or relative path.

For \function{execle()}, \function{execlpe()}, \function{execve()},
and \function{execvpe()} (note that these all end in \character{e}),
the \var{env} parameter must be a mapping which is used to define the
environment variables for the new process; the \function{execl()},
\function{execlp()}, \function{execv()}, and \function{execvp()}
all cause the new process to inherit the environment of the current
process.
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{_exit}{n}
Exit to the system with status \var{n}, without calling cleanup
handlers, flushing stdio buffers, etc.
Availability: \UNIX, Windows.

\begin{notice}
The standard way to exit is \code{sys.exit(\var{n})}.
\function{_exit()} should normally only be used in the child process
after a \function{fork()}.
\end{notice}
\end{funcdesc}

The following exit codes are a defined, and can be used with
\function{_exit()}, although they are not required.  These are
typically used for system programs written in Python, such as a
mail server's external command delivery program.

\begin{datadesc}{EX_OK}
Exit code that means no error occurred.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_USAGE}
Exit code that means the command was used incorrectly, such as when
the wrong number of arguments are given.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_DATAERR}
Exit code that means the input data was incorrect.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_NOINPUT}
Exit code that means an input file did not exist or was not readable.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_NOUSER}
Exit code that means a specified user did not exist.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_NOHOST}
Exit code that means a specified host did not exist.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_UNAVAILABLE}
Exit code that means that a required service is unavailable.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_SOFTWARE}
Exit code that means an internal software error was detected.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_OSERR}
Exit code that means an operating system error was detected, such as
the inability to fork or create a pipe.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_OSFILE}
Exit code that means some system file did not exist, could not be
opened, or had some other kind of error.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_CANTCREAT}
Exit code that means a user specified output file could not be created.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_IOERR}
Exit code that means that an error occurred while doing I/O on some file.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_TEMPFAIL}
Exit code that means a temporary failure occurred.  This indicates
something that may not really be an error, such as a network
connection that couldn't be made during a retryable operation.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_PROTOCOL}
Exit code that means that a protocol exchange was illegal, invalid, or
not understood.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_NOPERM}
Exit code that means that there were insufficient permissions to
perform the operation (but not intended for file system problems).
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_CONFIG}
Exit code that means that some kind of configuration error occurred.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{EX_NOTFOUND}
Exit code that means something like ``an entry was not found''.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

\begin{funcdesc}{fork}{}
Fork a child process.  Return \code{0} in the child, the child's
process id in the parent.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{forkpty}{}
Fork a child process, using a new pseudo-terminal as the child's
controlling terminal. Return a pair of \code{(\var{pid}, \var{fd})},
where \var{pid} is \code{0} in the child, the new child's process id
in the parent, and \var{fd} is the file descriptor of the master end
of the pseudo-terminal.  For a more portable approach, use the
\refmodule{pty} module.
Availability: Some flavors of \UNIX.
\end{funcdesc}

\begin{funcdesc}{kill}{pid, sig}
\index{process!killing}
\index{process!signalling}
Kill the process \var{pid} with signal \var{sig}.  Constants for the
specific signals available on the host platform are defined in the
\refmodule{signal} module.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{killpg}{pgid, sig}
\index{process!killing}
\index{process!signalling}
Kill the process group \var{pgid} with the signal \var{sig}.
Availability: \UNIX.
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{nice}{increment}
Add \var{increment} to the process's ``niceness''.  Return the new
niceness.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{plock}{op}
Lock program segments into memory.  The value of \var{op}
(defined in \code{<sys/lock.h>}) determines which segments are locked.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdescni}{popen}{\unspecified}
\funclineni{popen2}{\unspecified}
\funclineni{popen3}{\unspecified}
\funclineni{popen4}{\unspecified}
Run child processes, returning opened pipes for communications.  These
functions are described in section \ref{os-newstreams}.
\end{funcdescni}

\begin{funcdesc}{spawnl}{mode, path, \moreargs}
\funcline{spawnle}{mode, path, \moreargs, env}
\funcline{spawnlp}{mode, file, \moreargs}
\funcline{spawnlpe}{mode, file, \moreargs, env}
\funcline{spawnv}{mode, path, args}
\funcline{spawnve}{mode, path, args, env}
\funcline{spawnvp}{mode, file, args}
\funcline{spawnvpe}{mode, file, args, env}
Execute the program \var{path} in a new process.  If \var{mode} is
\constant{P_NOWAIT}, this function returns the process ID of the new
process; if \var{mode} is \constant{P_WAIT}, returns the process's
exit code if it exits normally, or \code{-\var{signal}}, where
\var{signal} is the signal that killed the process.  On Windows, the
process ID will actually be the process handle, so can be used with
the \function{waitpid()} function.

The \character{l} and \character{v} variants of the
\function{spawn*()} functions differ in how command-line arguments are
passed.  The \character{l} variants are perhaps the easiest to work
with if the number of parameters is fixed when the code is written;
the individual parameters simply become additional parameters to the
\function{spawnl*()} functions.  The \character{v} variants are good
when the number of parameters is variable, with the arguments being
passed in a list or tuple as the \var{args} parameter.  In either
case, the arguments to the child process must start with the name of
the command being run.

The variants which include a second \character{p} near the end
(\function{spawnlp()}, \function{spawnlpe()}, \function{spawnvp()},
and \function{spawnvpe()}) will use the \envvar{PATH} environment
variable to locate the program \var{file}.  When the environment is
being replaced (using one of the \function{spawn*e()} variants,
discussed in the next paragraph), the new environment is used as the
source of the \envvar{PATH} variable.  The other variants,
\function{spawnl()}, \function{spawnle()}, \function{spawnv()}, and
\function{spawnve()}, will not use the \envvar{PATH} variable to
locate the executable; \var{path} must contain an appropriate absolute
or relative path.

For \function{spawnle()}, \function{spawnlpe()}, \function{spawnve()},
and \function{spawnvpe()} (note that these all end in \character{e}),
the \var{env} parameter must be a mapping which is used to define the
environment variables for the new process; the \function{spawnl()},
\function{spawnlp()}, \function{spawnv()}, and \function{spawnvp()}
all cause the new process to inherit the environment of the current
process.

As an example, the following calls to \function{spawnlp()} and
\function{spawnvpe()} are equivalent:

\begin{verbatim}
import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')

L = ['cp', 'index.html', '/dev/null']
os.spawnvpe(os.P_WAIT, 'cp', L, os.environ)
\end{verbatim}

Availability: \UNIX, Windows.  \function{spawnlp()},
\function{spawnlpe()}, \function{spawnvp()} and \function{spawnvpe()}
are not available on Windows.
\versionadded{1.6}
\end{funcdesc}

\begin{datadesc}{P_NOWAIT}
\dataline{P_NOWAITO}
Possible values for the \var{mode} parameter to the \function{spawn*()}
family of functions.  If either of these values is given, the
\function{spawn*()} functions will return as soon as the new process
has been created, with the process ID as the return value.
Availability: \UNIX, Windows.
\versionadded{1.6}
\end{datadesc}

\begin{datadesc}{P_WAIT}
Possible value for the \var{mode} parameter to the \function{spawn*()}
family of functions.  If this is given as \var{mode}, the
\function{spawn*()} functions will not return until the new process
has run to completion and will return the exit code of the process the
run is successful, or \code{-\var{signal}} if a signal kills the
process.
Availability: \UNIX, Windows.
\versionadded{1.6}
\end{datadesc}

\begin{datadesc}{P_DETACH}
\dataline{P_OVERLAY}
Possible values for the \var{mode} parameter to the
\function{spawn*()} family of functions.  These are less portable than
those listed above.
\constant{P_DETACH} is similar to \constant{P_NOWAIT}, but the new
process is detached from the console of the calling process.
If \constant{P_OVERLAY} is used, the current process will be replaced;
the \function{spawn*()} function will not return.
Availability: Windows.
\versionadded{1.6}
\end{datadesc}

\begin{funcdesc}{startfile}{path}
Start a file with its associated application.  This acts like
double-clicking the file in Windows Explorer, or giving the file name
as an argument to the \program{start} command from the interactive
command shell: the file is opened with whatever application (if any)
its extension is associated.

\function{startfile()} returns as soon as the associated application
is launched.  There is no option to wait for the application to close,
and no way to retrieve the application's exit status.  The \var{path}
parameter is relative to the current directory.  If you want to use an
absolute path, make sure the first character is not a slash
(\character{/}); the underlying Win32 \cfunction{ShellExecute()}
function doesn't work if it is.  Use the \function{os.path.normpath()}
function to ensure that the path is properly encoded for Win32.
Availability: Windows.
\versionadded{2.0}
\end{funcdesc}

\begin{funcdesc}{system}{command}
Execute the command (a string) in a subshell.  This is implemented by
calling the Standard C function \cfunction{system()}, and has the
same limitations.  Changes to \code{posix.environ}, \code{sys.stdin},
etc.\ are not reflected in the environment of the executed command.

On \UNIX, the return value is the exit status of the process encoded in the
format specified for \function{wait()}.  Note that \POSIX{} does not
specify the meaning of the return value of the C \cfunction{system()}
function, so the return value of the Python function is system-dependent.

On Windows, the return value is that returned by the system shell after
running \var{command}, given by the Windows environment variable
\envvar{COMSPEC}: on \program{command.com} systems (Windows 95, 98 and ME)
this is always \code{0}; on \program{cmd.exe} systems (Windows NT, 2000
and XP) this is the exit status of the command run; on systems using
a non-native shell, consult your shell documentation.

Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{times}{}
Return a 5-tuple of floating point numbers indicating accumulated
(processor or other)
times, in seconds.  The items are: user time, system time, children's
user time, children's system time, and elapsed real time since a fixed
point in the past, in that order.  See the \UNIX{} manual page
\manpage{times}{2} or the corresponding Windows Platform API
documentation.
Availability: \UNIX, Windows.
\end{funcdesc}

\begin{funcdesc}{wait}{}
Wait for completion of a child process, and return a tuple containing
its pid and exit status indication: a 16-bit number, whose low byte is
the signal number that killed the process, and whose high byte is the
exit status (if the signal number is zero); the high bit of the low
byte is set if a core file was produced.
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.

If \var{pid} is greater than \code{0}, \function{waitpid()} requests
status information for that specific process.  If \var{pid} is
\code{0}, the request is for the status of any child in the process
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 handle \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 handles.
\end{funcdesc}

\begin{datadesc}{WNOHANG}
The option for \function{waitpid()} to avoid hanging if no child
process status is available immediately.
Availability: \UNIX.
\end{datadesc}

\begin{datadesc}{WCONTINUED}
This option causes child processes to be reported if they have been
continued from a job control stop since their status was last
reported.
Availability: Some \UNIX{} systems.
\versionadded{2.3}
\end{datadesc}

\begin{datadesc}{WUNTRACED}
This option causes child processes to be reported if they have been
stopped but their current state has not been reported since they were
stopped.
Availability: \UNIX.
\versionadded{2.3}
\end{datadesc}

The following functions take a process status code as returned by
\function{system()}, \function{wait()}, or \function{waitpid()} as a
parameter.  They may be used to determine the disposition of a
process.

\begin{funcdesc}{WCOREDUMP}{status}
Returns \code{True} if a core dump was generated for the process,
otherwise it returns \code{False}.
Availability: \UNIX.
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{WIFCONTINUED}{status}
Returns \code{True} if the process has been continued from a job
control stop, otherwise it returns \code{False}.
Availability: \UNIX.
\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{WIFSTOPPED}{status}
Returns \code{True} if the process has been stopped, otherwise it
returns \code{False}.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{WIFSIGNALED}{status}
Returns \code{True} if the process exited due to a signal, otherwise
it returns \code{False}.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{WIFEXITED}{status}
Returns \code{True} if the process exited using the \manpage{exit}{2}
system call, otherwise it returns \code{False}.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{WEXITSTATUS}{status}
If \code{WIFEXITED(\var{status})} is true, return the integer
parameter to the \manpage{exit}{2} system call.  Otherwise, the return
value is meaningless.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{WSTOPSIG}{status}
Return the signal which caused the process to stop.
Availability: \UNIX.
\end{funcdesc}

\begin{funcdesc}{WTERMSIG}{status}
Return the signal which caused the process to exit.
Availability: \UNIX.
\end{funcdesc}


\subsection{Miscellaneous System Information \label{os-path}}


\begin{funcdesc}{confstr}{name}
Return string-valued system configuration values.
\var{name} specifies the configuration value to retrieve; it may be a
string which is the name of a defined system value; these names are
specified in a number of standards (\POSIX, \UNIX{} 95, \UNIX{} 98, and
others).  Some platforms define additional names as well.  The names
known to the host operating system are given in the
\code{confstr_names} dictionary.  For configuration variables not
included in that mapping, passing an integer for \var{name} is also
accepted.
Availability: \UNIX.

If the configuration value specified by \var{name} isn't defined, the
empty string is returned.

If \var{name} is a string and is not known, \exception{ValueError} is
raised.  If a specific value for \var{name} is not supported by the
host system, even if it is included in \code{confstr_names}, an
\exception{OSError} is raised with \constant{errno.EINVAL} for the
error number.
\end{funcdesc}

\begin{datadesc}{confstr_names}
Dictionary mapping names accepted by \function{confstr()} to the
integer values defined for those names by the host operating system.
This can be used to determine the set of names known to the system.
Availability: \UNIX.
\end{datadesc}

\begin{funcdesc}{getloadavg}{}
Return the number of processes in the system run queue averaged over
the last 1, 5, and 15 minutes or raises OSError if the load average
was unobtainable.

\versionadded{2.3}
\end{funcdesc}

\begin{funcdesc}{sysconf}{name}
Return integer-valued system configuration values.
If the configuration value specified by \var{name} isn't defined,
\code{-1} is returned.  The comments regarding the \var{name}
parameter for \function{confstr()} apply here as well; the dictionary
that provides information on the known names is given by
\code{sysconf_names}.
Availability: \UNIX.
\end{funcdesc}

\begin{datadesc}{sysconf_names}
Dictionary mapping names accepted by \function{sysconf()} to the
integer values defined for those names by the host operating system.
This can be used to determine the set of names known to the system.
Availability: \UNIX.
\end{datadesc}


The follow data values are used to support path manipulation
operations.  These are defined for all platforms.

Higher-level operations on pathnames are defined in the
\refmodule{os.path} module.


\begin{datadesc}{curdir}
The constant string used by the operating system to refer to the current
directory.
For example: \code{'.'} for \POSIX{} or \code{':'} for the Macintosh.
Also available via \module{os.path}.
\end{datadesc}

\begin{datadesc}{pardir}
The constant string used by the operating system to refer to the parent
directory.
For example: \code{'..'} for \POSIX{} or \code{'::'} for the Macintosh.
Also available via \module{os.path}.
\end{datadesc}

\begin{datadesc}{sep}
The character used by the operating system to separate pathname components,
for example, \character{/} for \POSIX{} or \character{:} for the
Macintosh.  Note that knowing this is not sufficient to be able to
parse or concatenate pathnames --- use \function{os.path.split()} and
\function{os.path.join()} --- but it is occasionally useful.
Also available via \module{os.path}.
\end{datadesc}

\begin{datadesc}{altsep}
An alternative character used by the operating system to separate pathname
components, or \code{None} if only one separator character exists.  This is
set to \character{/} on Windows systems where \code{sep} is a
backslash.
Also available via \module{os.path}.
\end{datadesc}

\begin{datadesc}{extsep}
The character which separates the base filename from the extension;
for example, the \character{.} in \file{os.py}.
Also available via \module{os.path}.
\versionadded{2.2}
\end{datadesc}

\begin{datadesc}{pathsep}
The character conventionally used by the operating system to separate
search patch components (as in \envvar{PATH}), such as \character{:} for
\POSIX{} or \character{;} for Windows.
Also available via \module{os.path}.
\end{datadesc}

\begin{datadesc}{defpath}
The default search path used by \function{exec*p*()} and
\function{spawn*p*()} if the environment doesn't have a \code{'PATH'}
key.
Also available via \module{os.path}.
\end{datadesc}

\begin{datadesc}{linesep}
The string used to separate (or, rather, terminate) lines on the
current platform.  This may be a single character, such as \code{'\e
n'} for \POSIX{} or \code{'\e r'} for Mac OS, or multiple characters,
for example, \code{'\e r\e n'} for Windows.
\end{datadesc}

\begin{datadesc}{devnull}
The file path of the null device.
For example: \code{'/dev/null'} for \POSIX{} or \code{'Dev:Nul'} for the
Macintosh.
Also available via \module{os.path}.
\versionadded{2.4}
\end{datadesc}
