blob: 554c3cc5f5ad7bcef1871627b35ee192618157e2 [file] [log] [blame]
<html lang="en">
<head>
<title>Executing a File - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Processes.html#Processes" title="Processes">
<link rel="prev" href="Creating-a-Process.html#Creating-a-Process" title="Creating a Process">
<link rel="next" href="Process-Completion.html#Process-Completion" title="Process Completion">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Executing-a-File"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Process-Completion.html#Process-Completion">Process Completion</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Creating-a-Process.html#Creating-a-Process">Creating a Process</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Processes.html#Processes">Processes</a>
<hr>
</div>
<h3 class="section">26.5 Executing a File</h3>
<p><a name="index-executing-a-file-3169"></a><a name="index-g_t_0040code_007bexec_007d-functions-3170"></a>
This section describes the <code>exec</code> family of functions, for executing
a file as a process image. You can use these functions to make a child
process execute a new program after it has been forked.
<p>To see the effects of <code>exec</code> from the point of view of the called
program, see <a href="Program-Basics.html#Program-Basics">Program Basics</a>.
<p><a name="index-unistd_002eh-3171"></a>The functions in this family differ in how you specify the arguments,
but otherwise they all do the same thing. They are declared in the
header file <samp><span class="file">unistd.h</span></samp>.
<!-- unistd.h -->
<!-- POSIX.1 -->
<div class="defun">
&mdash; Function: int <b>execv</b> (<var>const char *filename, char *const argv</var><tt>[]</tt>)<var><a name="index-execv-3172"></a></var><br>
<blockquote><p>The <code>execv</code> function executes the file named by <var>filename</var> as a
new process image.
<p>The <var>argv</var> argument is an array of null-terminated strings that is
used to provide a value for the <code>argv</code> argument to the <code>main</code>
function of the program to be executed. The last element of this array
must be a null pointer. By convention, the first element of this array
is the file name of the program sans directory names. See <a href="Program-Arguments.html#Program-Arguments">Program Arguments</a>, for full details on how programs can access these arguments.
<p>The environment for the new process image is taken from the
<code>environ</code> variable of the current process image; see
<a href="Environment-Variables.html#Environment-Variables">Environment Variables</a>, for information about environments.
</p></blockquote></div>
<!-- unistd.h -->
<!-- POSIX.1 -->
<div class="defun">
&mdash; Function: int <b>execl</b> (<var>const char *filename, const char *arg0, <small class="dots">...</small></var>)<var><a name="index-execl-3173"></a></var><br>
<blockquote><p>This is similar to <code>execv</code>, but the <var>argv</var> strings are
specified individually instead of as an array. A null pointer must be
passed as the last such argument.
</p></blockquote></div>
<!-- unistd.h -->
<!-- POSIX.1 -->
<div class="defun">
&mdash; Function: int <b>execve</b> (<var>const char *filename, char *const argv</var><tt>[]</tt><var>, char *const env</var><tt>[]</tt>)<var><a name="index-execve-3174"></a></var><br>
<blockquote><p>This is similar to <code>execv</code>, but permits you to specify the environment
for the new program explicitly as the <var>env</var> argument. This should
be an array of strings in the same format as for the <code>environ</code>
variable; see <a href="Environment-Access.html#Environment-Access">Environment Access</a>.
</p></blockquote></div>
<!-- unistd.h -->
<!-- POSIX.1 -->
<div class="defun">
&mdash; Function: int <b>execle</b> (<var>const char *filename, const char *arg0, char *const env</var><tt>[]</tt><var>, <small class="dots">...</small></var>)<var><a name="index-execle-3175"></a></var><br>
<blockquote><p>This is similar to <code>execl</code>, but permits you to specify the
environment for the new program explicitly. The environment argument is
passed following the null pointer that marks the last <var>argv</var>
argument, and should be an array of strings in the same format as for
the <code>environ</code> variable.
</p></blockquote></div>
<!-- unistd.h -->
<!-- POSIX.1 -->
<div class="defun">
&mdash; Function: int <b>execvp</b> (<var>const char *filename, char *const argv</var><tt>[]</tt>)<var><a name="index-execvp-3176"></a></var><br>
<blockquote><p>The <code>execvp</code> function is similar to <code>execv</code>, except that it
searches the directories listed in the <code>PATH</code> environment variable
(see <a href="Standard-Environment.html#Standard-Environment">Standard Environment</a>) to find the full file name of a
file from <var>filename</var> if <var>filename</var> does not contain a slash.
<p>This function is useful for executing system utility programs, because
it looks for them in the places that the user has chosen. Shells use it
to run the commands that users type.
</p></blockquote></div>
<!-- unistd.h -->
<!-- POSIX.1 -->
<div class="defun">
&mdash; Function: int <b>execlp</b> (<var>const char *filename, const char *arg0, <small class="dots">...</small></var>)<var><a name="index-execlp-3177"></a></var><br>
<blockquote><p>This function is like <code>execl</code>, except that it performs the same
file name searching as the <code>execvp</code> function.
</p></blockquote></div>
<p>The size of the argument list and environment list taken together must
not be greater than <code>ARG_MAX</code> bytes. See <a href="General-Limits.html#General-Limits">General Limits</a>. In
the GNU system, the size (which compares against <code>ARG_MAX</code>)
includes, for each string, the number of characters in the string, plus
the size of a <code>char *</code>, plus one, rounded up to a multiple of the
size of a <code>char *</code>. Other systems may have somewhat different
rules for counting.
<p>These functions normally don't return, since execution of a new program
causes the currently executing program to go away completely. A value
of <code>-1</code> is returned in the event of a failure. In addition to the
usual file name errors (see <a href="File-Name-Errors.html#File-Name-Errors">File Name Errors</a>), the following
<code>errno</code> error conditions are defined for these functions:
<dl>
<dt><code>E2BIG</code><dd>The combined size of the new program's argument list and environment
list is larger than <code>ARG_MAX</code> bytes. The GNU system has no
specific limit on the argument list size, so this error code cannot
result, but you may get <code>ENOMEM</code> instead if the arguments are too
big for available memory.
<br><dt><code>ENOEXEC</code><dd>The specified file can't be executed because it isn't in the right format.
<br><dt><code>ENOMEM</code><dd>Executing the specified file requires more storage than is available.
</dl>
<p>If execution of the new file succeeds, it updates the access time field
of the file as if the file had been read. See <a href="File-Times.html#File-Times">File Times</a>, for more
details about access times of files.
<p>The point at which the file is closed again is not specified, but
is at some point before the process exits or before another process
image is executed.
<p>Executing a new process image completely changes the contents of memory,
copying only the argument and environment strings to new locations. But
many other attributes of the process are unchanged:
<ul>
<li>The process ID and the parent process ID. See <a href="Process-Creation-Concepts.html#Process-Creation-Concepts">Process Creation Concepts</a>.
<li>Session and process group membership. See <a href="Concepts-of-Job-Control.html#Concepts-of-Job-Control">Concepts of Job Control</a>.
<li>Real user ID and group ID, and supplementary group IDs. See <a href="Process-Persona.html#Process-Persona">Process Persona</a>.
<li>Pending alarms. See <a href="Setting-an-Alarm.html#Setting-an-Alarm">Setting an Alarm</a>.
<li>Current working directory and root directory. See <a href="Working-Directory.html#Working-Directory">Working Directory</a>. In the GNU system, the root directory is not copied when
executing a setuid program; instead the system default root directory
is used for the new program.
<li>File mode creation mask. See <a href="Setting-Permissions.html#Setting-Permissions">Setting Permissions</a>.
<li>Process signal mask; see <a href="Process-Signal-Mask.html#Process-Signal-Mask">Process Signal Mask</a>.
<li>Pending signals; see <a href="Blocking-Signals.html#Blocking-Signals">Blocking Signals</a>.
<li>Elapsed processor time associated with the process; see <a href="Processor-Time.html#Processor-Time">Processor Time</a>.
</ul>
<p>If the set-user-ID and set-group-ID mode bits of the process image file
are set, this affects the effective user ID and effective group ID
(respectively) of the process. These concepts are discussed in detail
in <a href="Process-Persona.html#Process-Persona">Process Persona</a>.
<p>Signals that are set to be ignored in the existing process image are
also set to be ignored in the new process image. All other signals are
set to the default action in the new process image. For more
information about signals, see <a href="Signal-Handling.html#Signal-Handling">Signal Handling</a>.
<p>File descriptors open in the existing process image remain open in the
new process image, unless they have the <code>FD_CLOEXEC</code>
(close-on-exec) flag set. The files that remain open inherit all
attributes of the open file description from the existing process image,
including file locks. File descriptors are discussed in <a href="Low_002dLevel-I_002fO.html#Low_002dLevel-I_002fO">Low-Level I/O</a>.
<p>Streams, by contrast, cannot survive through <code>exec</code> functions,
because they are located in the memory of the process itself. The new
process image has no streams except those it creates afresh. Each of
the streams in the pre-<code>exec</code> process image has a descriptor inside
it, and these descriptors do survive through <code>exec</code> (provided that
they do not have <code>FD_CLOEXEC</code> set). The new process image can
reconnect these to new streams using <code>fdopen</code> (see <a href="Descriptors-and-Streams.html#Descriptors-and-Streams">Descriptors and Streams</a>).
</body></html>