glenda.party
term% ls -F
term% pwd
$home/manuals/unix_v7/2/exec
term% cat index.txt
EXEC(2)                       System Calls Manual                      EXEC(2)



NAME
       execl,  execv,  execle, execve, execlp, execvp, exec, exece, environ  -
       execute a file

SYNOPSIS
       execl(name, arg0, arg1, ..., argn, 0)
       char *name, *arg0, *arg1, ..., *argn;

       execv(name, argv)
       char *name, *argv[ ];

       execle(name, arg0, arg1, ..., argn, 0, envp)
       char *name, *arg0, *arg1, ..., *argn, *envp[ ];

       execve(name, argv, envp);
       char *name, *argv[ ], *envp[ ];

       extern char **environ;

DESCRIPTION
       Exec in all its forms overlays the calling process with the named file,
       then transfers to the entry point of the core image of the file.  There
       can be no return from a successful exec;  the  calling  core  image  is
       lost.

       Files  remain  open  across  exec  unless explicit arrangement has been
       made; see ioctl(2).  Ignored signals remain ignored across these calls,
       but  signals that are caught (see signal(2)) are reset to their default
       values.

       Each user has a real user ID and group ID and an effective user ID  and
       group  ID.  The real ID identifies the person using the system; the ef‐
       fective ID determines his access privileges.  Exec changes  the  effec‐
       tive  user  and  group ID to the owner of the executed file if the file
       has the `set-user-ID' or `set-group-ID' modes.  The real user ID is not
       affected.

       The  name argument is a pointer to the name of the file to be executed.
       The pointers arg[0], arg[1] ...  address null-terminated strings.  Con‐
       ventionally arg[0] is the name of the file.

       From  C,  two  interfaces  are available.  Execl is useful when a known
       file with known arguments is being called; the arguments to  execl  are
       the  character  strings  constituting  the  file and the arguments; the
       first argument is conventionally the same as the file name (or its last
       component).  A 0 argument must end the argument list.

       The  execv version is useful when the number of arguments is unknown in
       advance; the arguments to execv are the name of the file to be executed
       and  a  vector  of strings containing the arguments.  The last argument
       string must be followed by a 0 pointer.

       When a C program is executed, it is called as follows:

            main(argc, argv, envp)
            int argc;
            char **argv, **envp;

       where argc is the argument count and argv  is  an  array  of  character
       pointers  to  the  arguments themselves.  As indicated, argc is conven‐
       tionally at least one and the first member of the  array  points  to  a
       string containing the name of the file.

       Argv is directly usable in another execv because argv[argc] is 0.

       Envp  is  a pointer to an array of strings that constitute the environ‐
       ment of the process.  Each string consists of a name, an ``='',  and  a
       null-terminated  value.   The array of pointers is terminated by a null
       pointer.  The shell sh(1) passes an environment entry for  each  global
       shell  variable defined when the program is called.  See environ(5) for
       some conventionally used  names.   The  C  run-time  start-off  routine
       places  a copy of envp in the global cell environ, which is used by ex‐
       ecv and execl to pass the environment to any  subprograms  executed  by
       the  current  program.   The  exec routines use lower-level routines as
       follows to pass an environment explicitly:
              execle(file, arg0, arg1, . . . , argn, 0, environ);
              execve(file, argv, environ);

       Execlp and execvp are called with the same arguments as execl  and  ex‐
       ecv,  but  duplicate the shell's actions in searching for an executable
       file in a list of directories.  The directory list is obtained from the
       environment.

FILES
       /bin/sh  shell, invoked if command file found by execlp or execvp

SEE ALSO
       fork(2), environ(5)

DIAGNOSTICS
       If  the  file  cannot be found, if it is not executable, if it does not
       start with a valid magic number (see a.out(5)), if  maximum  memory  is
       exceeded,  or if the arguments require too much space, a return consti‐
       tutes the diagnostic; the return value is -1.  Even for the super-user,
       at  least  one of the execute-permission bits must be set for a file to
       be executed.

BUGS
       If execvp is called to execute a file that turns out to be a shell com‐
       mand  file, and if it is impossible to execute the shell, the values of
       argv[0] and argv[-1] will be modified before return.

ASSEMBLER
       (exec = 11.)
       sys exec; name; argv

       (exece = 59.)
       sys exece; name; argv; envp

       Plain exec is obsoleted by exece, but remains for historical reasons.

       When the called file starts execution on the PDP11, the  stack  pointer
       points  to  a word containing the number of arguments.  Just above this
       number is a list of pointers to the argument  strings,  followed  by  a
       null  pointer,  followed by the pointers to the environment strings and
       then another null pointer.  The strings themselves follow; a 0 word  is
       left at the very top of memory.

         sp→     nargs
            arg0
            ...
            argn
            0
            env0
            ...
            envm
            0

        arg0:    <arg0\0>
            ...
        env0:    <env0\0>
            0

       On  the  Interdata 8/32, the stack begins at a conventional place (cur‐
       rently 0xD0000) and grows upwards.  After exec, the layout of  data  on
       the stack is as follows.

            int  0
        arg0:    byte ...
            ...
       argp0:    int  arg0
            ...
            int  0
       envp0:    int  env0
            ...
            int  0
        %2→ space     40
            int  nargs
            int  argp0
            int  envp0
        %3→

       This arrangement happens to conform well to C calling conventions.



                                                                       EXEC(2)