\section{Built-in Module \sectcode{posix}}

\bimodindex{posix}

This module provides access to operating system functionality that is
standardized by the C Standard and the POSIX standard (a thinly diguised
\UNIX{} interface).
It is available in all Python versions except on the Macintosh;
the MS-DOS version does not support certain functions.
The descriptions below are very terse; refer to the
corresponding \UNIX{} manual entry for more information.

Errors are reported as exceptions; the usual exceptions are given
for type errors, while errors reported by the system calls raise
\code{posix.error}, described below.

Module \code{posix} defines the following data items:

\renewcommand{\indexsubitem}{(data in module posix)}
\begin{datadesc}{environ}
A dictionary representing the string environment at the time
the interpreter was started.
(Modifying this dictionary does not affect the string environment of the
interpreter.)
For example,
\code{posix.environ['HOME']}
is the pathname of your home directory, equivalent to
\code{getenv("HOME")}
in C.
\end{datadesc}

\renewcommand{\indexsubitem}{(exception in module posix)}
\begin{excdesc}{error}
This exception is raised when an POSIX function returns a
POSIX-related error (e.g., not for illegal argument types).  Its
string value is \code{'posix.error'}.  The accompanying value is a
pair containing the numeric error code from \code{errno} and the
corresponding string, as would be printed by the C function
\code{perror()}.
\end{excdesc}

It defines the following functions:

\renewcommand{\indexsubitem}{(in module posix)}
\begin{funcdesc}{chdir}{path}
Change the current working directory to \var{path}.
\end{funcdesc}

\begin{funcdesc}{chmod}{path\, mode}
Change the mode of \var{path} to the numeric \var{mode}.
\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}.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{close}{fd}
Close file descriptor \var{fd}.
\end{funcdesc}

\begin{funcdesc}{dup}{fd}
Return a duplicate of file descriptor \var{fd}.
\end{funcdesc}

\begin{funcdesc}{dup2}{fd\, fd2}
Duplicate file descriptor \var{fd} to \var{fd2}, closing the latter
first if necessary.  Return \code{None}.
\end{funcdesc}

\begin{funcdesc}{execv}{path\, args}
Execute the executable \var{path} with argument list \var{args},
replacing the current process (i.e., the Python interpreter).
The argument list may be a tuple or list of strings.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{execve}{path\, args\, env}
Execute the executable \var{path} with argument list \var{args},
and environment \var{env},
replacing the current process (i.e., the Python interpreter).
The argument list may be a tuple or list of strings.
The environment must be a dictionary mapping strings to strings.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{_exit}{n}
Exit to the system with status \var{n}, without calling cleanup
handlers, flushing stdio buffers, etc.
(Not on MS-DOS.)

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

\begin{funcdesc}{fdopen}{fd\, mode}
Return an open file object connected to the file descriptor \var{fd},
open for reading and/or writing according to the \var{mode} string
(which has the same meaning as the \var{mode} argument to the built-in
\code{open()} function.
\end{funcdesc}

\begin{funcdesc}{fork}{}
Fork a child process.  Return 0 in the child, the child's process id
in the parent.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{fstat}{fd}
Return status for file descriptor \var{fd}, like \code{stat()}.
\end{funcdesc}

\begin{funcdesc}{getcwd}{}
Return a string representing the current working directory.
\end{funcdesc}

\begin{funcdesc}{getegid}{}
Return the current process's effective group id.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{geteuid}{}
Return the current process's effective user id.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{getgid}{}
Return the current process's group id.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{getpid}{}
Return the current process id.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{getppid}{}
Return the parent's process id.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{getuid}{}
Return the current process's user id.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{kill}{pid\, sig}
Kill the process \var{pid} with signal \var{sig}.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{link}{src\, dst}
Create a hard link pointing to \var{src} named \var{dst}.
(Not on MS-DOS.)
\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 includes the special entries
\code{'.'} and \code{'..'} if they are present in the directory.
\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}: 0 to set the position relative to
the beginning of the file; 1 to set it relative to the current
position; 2 to set it relative to the end of the file.
\end{funcdesc}

\begin{funcdesc}{lstat}{path}
Like \code{stat()}, but do not follow symbolic links.  (On systems
without symbolic links, this is identical to \code{posix.stat}.)
\end{funcdesc}

\begin{funcdesc}{mkdir}{path\, mode}
Create a directory named \var{path} with numeric mode \var{mode}.
\end{funcdesc}

\begin{funcdesc}{nice}{increment}
Add \var{incr} to the process' ``niceness''.  Return the new niceness.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{open}{file\, flags\, mode}
Open the file \var{file} and set various flags according to
\var{flags} and possibly its mode according to \var{mode}.
Return the file descriptor for the newly opened file.
\end{funcdesc}

\begin{funcdesc}{pipe}{}
Create a pipe.  Return a pair of file descriptors \code{(r, w)}
usable for reading and writing, respectively.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{popen}{command\, mode}
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'} or \code{'w'}.
(Not on MS-DOS.)
\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.
\end{funcdesc}

\begin{funcdesc}{readlink}{path}
Return a string representing the path to which the symbolic link
points.  (On systems without symbolic links, this always raises
\code{posix.error}.)
\end{funcdesc}

\begin{funcdesc}{rename}{src\, dst}
Rename the file or directory \var{src} to \var{dst}.
\end{funcdesc}

\begin{funcdesc}{rmdir}{path}
Remove the directory \var{path}.
\end{funcdesc}

\begin{funcdesc}{setgid}{gid}
Set the current process's group id.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{setuid}{uid}
Set the current process's user id.
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{stat}{path}
Perform a {\em stat} system call on the given path.  The return value
is a tuple of at least 10 integers giving the most important (and
portable) members of the {\em stat} structure, in the order
\code{st_mode},
\code{st_ino},
\code{st_dev},
\code{st_nlink},
\code{st_uid},
\code{st_gid},
\code{st_size},
\code{st_atime},
\code{st_mtime},
\code{st_ctime}.
More items may be added at the end by some implementations.
(On MS-DOS, some items are filled with dummy values.)

Note: The standard module \code{stat} defines functions and constants
that are useful for extracting information from a stat structure.
\end{funcdesc}

\begin{funcdesc}{symlink}{src\, dst}
Create a symbolic link pointing to \var{src} named \var{dst}.  (On
systems without symbolic links, this always raises
\code{posix.error}.)
\end{funcdesc}

\begin{funcdesc}{system}{command}
Execute the command (a string) in a subshell.  This is implemented by
calling the Standard C function \code{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.  The return
value is the exit status of the process as returned by Standard C
\code{system()}.
\end{funcdesc}

\begin{funcdesc}{times}{}
Return a 4-tuple of floating point numbers indicating accumulated CPU
times, in seconds.  The items are: user time, system time, children's
user time, and children's system time, in that order.  See the \UNIX{}
manual page {\it times}(2).  (Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{umask}{mask}
Set the current numeric umask and returns the previous umask.
(Not on MS-DOS.)
\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; an better way to get the
hostname is \code{socket.gethostname()}.  (Not on MS-DOS, nor on older
\UNIX{} systems.)
\end{funcdesc}

\begin{funcdesc}{unlink}{path}
Unlink \var{path}.
\end{funcdesc}

\begin{funcdesc}{utime}{path\, \(atime\, mtime\)}
Set the access and modified time of the file to the given values.
(The second argument is a tuple of two items.)
\end{funcdesc}

\begin{funcdesc}{wait}{}
Wait for completion of a child process, and return a tuple containing
its pid and exit status indication (encoded as by \UNIX{}).
(Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{waitpid}{pid\, options}
Wait for completion of a child process given by proces id, and return
a tuple containing its pid and exit status indication (encoded as by
\UNIX{}).  The semantics of the call are affected by the value of
the integer options, which should be 0 for normal operation.  (If the
system does not support waitpid(), this always raises
\code{posix.error}.  Not on MS-DOS.)
\end{funcdesc}

\begin{funcdesc}{write}{fd\, str}
Write the string \var{str} to file descriptor \var{fd}.
Return the number of bytes actually written.
\end{funcdesc}
