Provided by: manpages-dev_2.17-1_all bug


       execve - execute program


       #include <unistd.h>

       int  execve(const  char  *filename,  char  *const  argv [], char *const


       execve() executes the program pointed to by filename.  filename must be
       either  a  binary  executable,  or a script starting with a line of the
       form "#! interpreter [arg]".  In the latter case, the interpreter  must
       be  a  valid  pathname  for an executable which is not itself a script,
       which will be invoked as interpreter [arg] filename.

       argv is an array of argument strings passed to the new  program.   envp
       is an array of strings, conventionally of the form key=value, which are
       passed as environment to the new program.  Both argv and envp  must  be
       terminated  by a null pointer.  The argument vector and environment can
       be accessed by the called program’s main function, when it  is  defined
       as int main(int argc, char *argv[], char *envp[]).

       execve() does not return on success, and the text, data, bss, and stack
       of the calling process are overwritten by that of the  program  loaded.
       The  program  invoked  inherits the calling process’s PID, and any open
       file descriptors that are not set to close-on-exec.  Signals pending on
       the  calling  process are cleared.  Any signals set to be caught by the
       calling process are reset to  their  default  behaviour.   The  SIGCHLD
       signal (when set to SIG_IGN) may or may not be reset to SIG_DFL.

       If  the current program is being ptraced, a SIGTRAP is sent to it after
       a successful execve().

       If the set-user-ID bit is  set  on  the  program  file  pointed  to  by
       filename,  and  the  calling  process  is  not  being ptraced, then the
       effective user ID of the calling process is  changed  to  that  of  the
       owner of the program file.  Similarly, when the set-group-ID bit of the
       program file is set the effective group ID of the  calling  process  is
       set to the group of the program file.

       If  the  executable  is  an  a.out dynamically-linked binary executable
       containing shared-library stubs, the Linux dynamic linker  is
       called  at the start of execution to bring needed shared libraries into
       core and link the executable with them.

       If  the  executable  is  a  dynamically-linked  ELF   executable,   the
       interpreter  named  in the PT_INTERP segment is used to load the needed
       shared libraries.  This interpreter is typically /lib/ for
       binaries  linked  with  the Linux libc version 5, or /lib/
       for binaries linked with the GNU libc version 2.


       On success, execve() does not return, on  error  -1  is  returned,  and
       errno is set appropriately.


       E2BIG  The total number of bytes in the environment (envp) and argument
              list (argv) is too large.

       EACCES Search permission is denied on a component of the path prefix of
              filename  or  the  name  of  a  script  interpreter.   (See also

       EACCES The file or a script interpreter is not a regular file.

       EACCES Execute permission is denied for the file or  a  script  or  ELF

       EACCES The file system is mounted noexec.

       EFAULT filename points outside your accessible address space.

       EINVAL An  ELF  executable  had  more than one PT_INTERP segment (i.e.,
              tried to name more than one interpreter).

       EIO    An I/O error occurred.

       EISDIR An ELF interpreter was a directory.

              An ELF interpreter was not in a recognised format.

       ELOOP  Too many symbolic links were encountered in  resolving  filename
              or the name of a script or ELF interpreter.

       EMFILE The process has the maximum number of files open.

              filename is too long.

       ENFILE The  system  limit  on  the  total number of open files has been

       ENOENT The file filename or a script or ELF interpreter does not exist,
              or  a  shared  library  needed for file or interpreter cannot be

              An executable is not in a recognised format, is  for  the  wrong
              architecture,  or  has  some  other  format  error that means it
              cannot be executed.

       ENOMEM Insufficient kernel memory was available.

              A component of the path prefix of filename or a  script  or  ELF
              interpreter is not a directory.

       EPERM  The  file  system  is  mounted  nosuid,  the  user  is  not  the
              superuser, and the file has an SUID or SGID bit set.

       EPERM  The process is being traced, the user is not the  superuser  and
              the file has an SUID or SGID bit set.

              Executable was open for writing by one or more processes.


       SVr4,  SVID,  X/OPEN, 4.3BSD.  POSIX does not document the #!  behavior
       but  is  otherwise  compatible.   SVr4   documents   additional   error
       conditions  EAGAIN,  EINTR, ELIBACC, ENOLINK, EMULTIHOP; POSIX does not
       EISDIR or ELIBBAD error conditions.


       SUID and SGID processes can not be ptrace()d.

       Linux ignores the SUID and SGID bits on scripts.

       The  result  of  mounting a filesystem nosuid vary between Linux kernel
       versions: some will refuse execution of SUID/SGID executables when this
       would give the user powers she did not have already (and return EPERM),
       some will just ignore the SUID/SGID bits and exec() successfully.

       A maximum line length of 127 characters is allowed for the  first  line
       in a #! executable shell script.


       With  Unix V6 the argument list of an exec() call was ended by 0, while
       the argument list of main was ended by -1. Thus, this argument list was
       not  directly  usable in a further exec() call.  Since Unix V7 both are


       chmod(2), fork(2), path_resolution(2), ptrace(2), execl(3), environ(5),