exec(3p) - Online Manual Page Of Unix/Linux

  Command: man perldoc info search(apropos)

WebSearch:
Our Recommended Sites: Full-Featured Editor
 

EXEC(P)                                                                                   EXEC(P)



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

SYNOPSIS
       #include <unistd.h>

       extern char **environ;
       int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
       int execv(const char *path, char *const argv[]);
       int execle(const char *path, const char *arg0, ... /*,
              (char *)0, char *const envp[]*/);
       int execve(const char *path, char *const argv[], char *const envp[]);
       int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);
       int execvp(const char *file, char *const argv[]);


DESCRIPTION
       The  exec  family  of functions shall replace the current process image with a new process
       image. The new image shall be constructed from a regular, executable file called  the  new
       process  image  file. There shall be no return from a successful exec, because the calling
       process image is overlaid by the new process image.

       When a C-language program is executed as a result of this call, it shall be entered  as  a
       C-language function call as follows:


              int main (int argc, char *argv[]);

       where  argc  is the argument count and argv is an array of character pointers to the argu-
       ments themselves. In addition, the following variable:


              extern char **environ;

       is initialized as a pointer to an array of character pointers to the environment  strings.
       The argv and environ arrays are each terminated by a null pointer. The null pointer termi-
       nating the argv array is not counted in argc.

       Conforming multi-threaded applications shall not use the environ  variable  to  access  or
       modify any environment variable while any other thread is concurrently modifying any envi-
       ronment variable.  A call to any function dependent on any environment variable  shall  be
       considered a use of the environ variable to access that environment variable.

       The  arguments specified by a program with one of the exec functions shall be passed on to
       the new process image in the corresponding main() arguments.

       The argument path points to a pathname that identifies the new process image file.

       The argument file is used to construct a pathname that identifies the  new  process  image
       file.  If the file argument contains a slash character, the file argument shall be used as
       the pathname for this file. Otherwise, the path prefix for this  file  is  obtained  by  a
       search  of  the  directories passed as the environment variable PATH (see the Base Defini-
       tions volume of IEEE Std 1003.1-2001, Chapter 8, Environment Variables).  If this environ-
       ment variable is not present, the results of the search are implementation-defined.

       There  are two distinct ways in which the contents of the process image file may cause the
       execution to fail, distinguished by the setting of errno to either [ENOEXEC]  or  [EINVAL]
       (see the ERRORS section). In the cases where the other members of the exec family of func-
       tions would fail and set errno to [ENOEXEC], the execlp()  and  execvp()  functions  shall
       execute  a  command interpreter and the environment of the executed command shall be as if
       the process invoked the sh utility using execl() as follows:


              execl(<shell path>, arg0, file, arg1, ..., (char *)0);

       where <shell path> is an unspecified pathname for the sh  utility,  file  is  the  process
       image  file, and for execvp(), where arg0, arg1, and so on correspond to the values passed
       to execvp() in argv[0], argv[1], and so on.

       The arguments represented by arg0,... are pointers to null-terminated  character  strings.
       These  strings  shall constitute the argument list available to the new process image. The
       list is terminated by a null pointer. The argument arg0 should point to a filename that is
       associated with the process being started by one of the exec functions.

       The argument argv is an array of character pointers to null-terminated strings. The appli-
       cation shall ensure that the last member of this array is a null  pointer.  These  strings
       shall  constitute  the  argument  list  available  to the new process image.  The value in
       argv[0] should point to a filename that is associated with the process  being  started  by
       one of the exec functions.

       The  argument  envp  is  an  array of character pointers to null-terminated strings. These
       strings shall constitute the environment for the new process image. The envp array is ter-
       minated by a null pointer.

       For  those  forms  not  containing  an  envp  pointer  (  execl(),  execv(), execlp(), and
       execvp()), the environment for the new process image shall  be  taken  from  the  external
       variable environ in the calling process.

       The number of bytes available for the new process' combined argument and environment lists
       is {ARG_MAX}. It is implementation-defined whether null terminators, pointers, and/or  any
       alignment bytes are included in this total.

       File  descriptors  open  in the calling process image shall remain open in the new process
       image, except for those whose close-on- exec  flag  FD_CLOEXEC  is  set.  For  those  file
       descriptors  that  remain  open,  all  attributes  of  the  open  file  description remain
       unchanged. For any file descriptor that is closed for this reason, file locks are  removed
       as  a  result of the close as described in close() . Locks that are not removed by closing
       of file descriptors remain unchanged.

       If file descriptors 0, 1, and 2 would otherwise be closed after a successful call  to  one
       of  the  exec  family  of functions, and the new process image file has the set-user-ID or
       set-group-ID file mode bits set,    and the ST_NOSUID bit is not set for the  file  system
       containing  the  new process image file,  implementations may open an unspecified file for
       each of these file descriptors in the new process image.

       Directory streams open in the calling process image shall be closed  in  the  new  process
       image.

       The  state  of the floating-point environment in the new process image shall be set to the
       default.

       The state of conversion descriptors and message catalog descriptors  in  the  new  process
       image is undefined.   For the new process image, the equivalent of:


              setlocale(LC_ALL, "C")

       shall be executed at start-up.

       Signals  set  to the default action (SIG_DFL) in the calling process image shall be set to
       the default action in the new process image. Except for SIGCHLD, signals set to be ignored
       (SIG_IGN)  by  the  calling  process  image  shall be set to be ignored by the new process
       image. Signals set to be caught by the calling process image shall be set to  the  default
       action  in  the  new  process  image  (see <signal.h>). If the SIGCHLD signal is set to be
       ignored by the calling process image, it is unspecified whether the SIGCHLD signal is  set
       to be ignored or to the default action in the new process image.   After a successful call
       to any of the exec functions, alternate signal stacks are not preserved and the SA_ONSTACK
       flag shall be cleared for all signals.

       After  a successful call to any of the exec functions, any functions previously registered
       by atexit() are no longer registered.

       If the ST_NOSUID bit is set for the file system containing the  new  process  image  file,
       then  the effective user ID, effective group ID, saved set-user-ID, and saved set-group-ID
       are unchanged in the new process image. Otherwise,  if the set-user-ID mode bit of the new
       process  image file is set, the effective user ID of the new process image shall be set to
       the user ID of the new process image file. Similarly, if the set-group-ID mode bit of  the
       new  process  image  file is set, the effective group ID of the new process image shall be
       set to the group ID of the new process image file. The real user ID, real  group  ID,  and
       supplementary  group  IDs  of  the new process image shall remain the same as those of the
       calling process image. The effective user ID and effective group ID  of  the  new  process
       image  shall  be  saved  (as  the saved set-user-ID and the saved set-group-ID) for use by
       setuid().

       Any shared memory segments attached to the calling process image shall not be attached  to
       the new process image.

       Any  named  semaphores  open  in  the calling process shall be closed as if by appropriate
       calls to sem_close().

       Any blocks of typed memory that were mapped in the calling process  are  unmapped,  as  if
       munmap() was implicitly called to unmap them.

       Memory  locks  established by the calling process via calls to mlockall() or mlock() shall
       be removed. If locked pages in the address space of the calling process  are  also  mapped
       into  the  address  spaces of other processes and are locked by those processes, the locks
       established by the other processes shall be unaffected by the call by this process to  the
       exec function. If the exec function fails, the effect on memory locks is unspecified.

       Memory  mappings  created  in the process are unmapped before the address space is rebuilt
       for the new process image.

       For the SCHED_FIFO and SCHED_RR scheduling policies,  the  policy  and  priority  settings
       shall  not  be  changed  by a call to an exec function. For other scheduling policies, the
       policy and priority settings on exec are implementation-defined.

       Per-process timers created by the calling process shall be deleted  before  replacing  the
       current process image with the new process image.

       All open message queue descriptors in the calling process shall be closed, as described in
       mq_close() .

       Any outstanding asynchronous I/O operations may be canceled. Those asynchronous I/O opera-
       tions  that  are not canceled shall complete as if the exec function had not yet occurred,
       but any associated signal notifications shall be suppressed. It is unspecified whether the
       exec function itself blocks awaiting such I/O completion.  In no event, however, shall the
       new process image created by the exec function be affected by the presence of  outstanding
       asynchronous  I/O  operations  at the time the exec function is called. Whether any I/O is
       canceled, and which I/O may be canceled upon exec, is implementation-defined.

       The new process image shall inherit the CPU-time clock of the calling process image.  This
       inheritance  means  that the process CPU-time clock of the process being exec-ed shall not
       be reinitialized or altered as a result of the exec function other  than  to  reflect  the
       time spent by the process executing the exec function itself.

       The  initial  value  of  the CPU-time clock of the initial thread of the new process image
       shall be set to zero.

       If the calling process is being traced, the new process image shall continue to be  traced
       into  the same trace stream as the original process image, but the new process image shall
       not inherit the mapping of trace event names to trace  event  type  identifiers  that  was
       defined  by calls to the posix_trace_eventid_open() or the posix_trace_trid_eventid_open()
       functions in the calling process image.

       If the calling process is a trace controller process, any trace streams that were  created
       by the calling process shall be shut down as described in the posix_trace_shutdown() func-
       tion.

       The new process shall inherit at least the following attributes from the  calling  process
       image:

        * Nice value (see nice() )


        * semadj values (see semop() )


        * Process ID


        * Parent process ID


        * Process group ID


        * Session membership


        * Real user ID


        * Real group ID


        * Supplementary group IDs


        * Time left until an alarm clock signal (see alarm() )


        * Current working directory


        * Root directory


        * File mode creation mask (see umask() )


        * File size limit (see ulimit() )


        * Process signal mask (see sigprocmask() )


        * Pending signal (see sigpending() )


        * tms_utime, tms_stime, tms_cutime, and tms_cstime (see times() )


        * Resource limits


        * Controlling terminal


        * Interval timers


       All  other  process attributes defined in this volume of IEEE Std 1003.1-2001 shall be the
       same in the new and old process images. The inheritance of process attributes not  defined
       by this volume of IEEE Std 1003.1-2001 is implementation-defined.

       A  call  to any exec function from a process with more than one thread shall result in all
       threads being terminated and the new  executable  image  being  loaded  and  executed.  No
       destructor functions shall be called.

       Upon successful completion, the exec functions shall mark for update the st_atime field of
       the file. If an exec function failed but was  able  to  locate  the  process  image  file,
       whether  the  st_atime field is marked for update is unspecified. Should the exec function
       succeed, the process image file shall be considered to have been opened with open().   The
       corresponding  close()  shall be considered to occur at a time after this open, but before
       process termination or successful completion of a subsequent call to one of the exec func-
       tions, posix_spawn(), or posix_spawnp().  The argv[] and envp[] arrays of pointers and the
       strings to which those arrays point shall not be modified by a call to  one  of  the  exec
       functions, except as a consequence of replacing the process image.

       The  saved  resource  limits in the new process image are set to be a copy of the process'
       corresponding hard and soft limits.

RETURN VALUE
       If one of the exec functions returns to the calling process image, an error has  occurred;
       the return value shall be -1, and errno shall be set to indicate the error.

ERRORS
       The exec functions shall fail if:

       E2BIG  The  number  of bytes used by the new process image's argument list and environment
              list is greater than the system-imposed limit of {ARG_MAX} bytes.

       EACCES Search permission is denied for a directory listed in the new process image  file's
              path  prefix, or the new process image file denies execution permission, or the new
              process image file is not a regular file and the implementation  does  not  support
              execution of files of its type.

       EINVAL The new process image file has the appropriate permission and has a recognized exe-
              cutable binary format, but the system does not support execution  of  a  file  with
              this format.

       ELOOP  A  loop  exists in symbolic links encountered during resolution of the path or file
              argument.

       ENAMETOOLONG
              The length of the path or file arguments exceeds {PATH_MAX} or a pathname component
              is longer than {NAME_MAX}.

       ENOENT A  component  of  path or file does not name an existing file or path or file is an
              empty string.

       ENOTDIR
              A component of the new process image file's path prefix is not a directory.


       The exec functions, except for execlp() and execvp(), shall fail if:

       ENOEXEC
              The new process image file has the appropriate access permission but has an  unrec-
              ognized format.


       The exec functions may fail if:

       ELOOP  More  than  {SYMLOOP_MAX}  symbolic links were encountered during resolution of the
              path or file argument.

       ENAMETOOLONG
              As a result of encountering a symbolic link in resolution of the path argument, the
              length of the substituted pathname string exceeded {PATH_MAX}.

       ENOMEM The  new process image requires more memory than is allowed by the hardware or sys-
              tem-imposed memory management constraints.

       ETXTBSY
              The new process image file is a pure procedure (shared text) file that is currently
              open for writing by some process.


       The following sections are informative.

EXAMPLES
   Using execl()
       The following example executes the ls command, specifying the pathname of the executable (
       /bin/ls) and using arguments supplied directly to the  command  to  produce  single-column
       output.


              #include <unistd.h>


              int ret;
              ...
              ret = execl ("/bin/ls", "ls", "-1", (char *)0);

   Using execle()
       The following example is similar to Using execl() . In addition, it specifies the environ-
       ment for the new process image using the env argument.


              #include <unistd.h>


              int ret;
              char *env[] = { "HOME=/usr/home", "LOGNAME=home", (char *)0 };
              ...
              ret = execle ("/bin/ls", "ls", "-l", (char *)0, env);

   Using execlp()
       The following example searches for the location of the ls command  among  the  directories
       specified by the PATH environment variable.


              #include <unistd.h>


              int ret;
              ...
              ret = execlp ("ls", "ls", "-l", (char *)0);

   Using execv()
       The following example passes arguments to the ls command in the cmd array.


              #include <unistd.h>


              int ret;
              char *cmd[] = { "ls", "-l", (char *)0 };
              ...
              ret = execv ("/bin/ls", cmd);

   Using execve()
       The  following  example passes arguments to the ls command in the cmd array, and specifies
       the environment for the new process image using the env argument.


              #include <unistd.h>


              int ret;
              char *cmd[] = { "ls", "-l", (char *)0 };
              char *env[] = { "HOME=/usr/home", "LOGNAME=home", (char *)0 };
              ...
              ret = execve ("/bin/ls", cmd, env);

   Using execvp()
       The following example searches for the location of the ls command  among  the  directories
       specified  by the PATH environment variable, and passes arguments to the ls command in the
       cmd array.


              #include <unistd.h>


              int ret;
              char *cmd[] = { "ls", "-l", (char *)0 };
              ...
              ret = execvp ("ls", cmd);

APPLICATION USAGE
       As the state of conversion descriptors and message catalog descriptors in the new  process
       image  is undefined, conforming applications should not rely on their use and should close
       them prior to calling one of the exec functions.

       Applications that require other than the default POSIX locale should call setlocale() with
       the appropriate parameters to establish the locale of the new process.

       The environ array should not be accessed directly by the application.

       Applications should not depend on file descriptors 0, 1, and 2 being closed after an exec.
       A future version may allow these file descriptors to be automatically opened for any  pro-
       cess.

RATIONALE
       Early proposals required that the value of argc passed to main() be "one or greater". This
       was driven by the same requirement in drafts of the ISO C standard.  In  fact,  historical
       implementations  have  passed a value of zero when no arguments are supplied to the caller
       of the exec functions.  This requirement was removed from the ISO C  standard  and  subse-
       quently removed from this volume of IEEE Std 1003.1-2001 as well. The wording, in particu-
       lar the use of the word should, requires a Strictly Conforming POSIX Application  to  pass
       at  least one argument to the exec function, thus guaranteeing that argc be one or greater
       when invoked by such an application. In fact, this is good practice, since  many  existing
       applications reference argv[0] without first checking the value of argc.

       The  requirement  on  a  Strictly  Conforming POSIX Application also states that the value
       passed as the first argument be a filename associated  with  the  process  being  started.
       Although some existing applications pass a pathname rather than a filename in some circum-
       stances, a filename is more generally useful, since the common  usage  of  argv[0]  is  in
       printing  diagnostics. In some cases the filename passed is not the actual filename of the
       file; for example, many implementations of the login utility use a convention of prefixing
       a  hyphen ( '-' ) to the actual filename, which indicates to the command interpreter being
       invoked that it is a "login shell".

       Historically there have been two ways that implementations can exec shell scripts.

       One common historical implementation is that the execl(), execv(), execle(), and  execve()
       functions return an [ENOEXEC] error for any file not recognizable as executable, including
       a shell script. When the execlp() and execvp()  functions  encounter  such  a  file,  they
       assume  the  file to be a shell script and invoke a known command interpreter to interpret
       such files. This is  now  required  by  IEEE Std 1003.1-2001.   These  implementations  of
       execvp() and execlp() only give the [ENOEXEC] error in the rare case of a problem with the
       command interpreter's executable file. Because of  these  implementations,  the  [ENOEXEC]
       error  is  not mentioned for execlp() or execvp(), although implementations can still give
       it.

       Another way that some historical implementations handle shell scripts  is  by  recognizing
       the  first  two  bytes of the file as the character string "#!" and using the remainder of
       the first line of the file as the name of the command interpreter to execute.

       One potential source of confusion noted by the standard developers is over  how  the  con-
       tents  of  a  process  image file affect the behavior of the exec family of functions. The
       following is a description of the actions taken:

        1. If the process image file is a valid executable (in a format that  is  executable  and
           valid and having appropriate permission) for this system, then the system executes the
           file.


        2. If the process image file has appropriate permission and is in a format that  is  exe-
           cutable  but not valid for this system (such as a recognized binary for another archi-
           tecture), then this is an error and errno is set to [EINVAL] (see later  RATIONALE  on
           [EINVAL]).


        3. If the process image file has appropriate permission but is not otherwise recognized:

            a. If  this is a call to execlp() or execvp(), then they invoke a command interpreter
               assuming that the process image file is a shell script.


            b. If this is not a call to execlp() or execvp(), then an error occurs and  errno  is
               set to [ENOEXEC].



       Applications that do not require to access their arguments may use the form:


              main(void)
       as  specified  in  the ISO C standard. However, the implementation will always provide the
       two arguments argc and argv, even if they are not used.

       Some implementations provide a third argument to main() called envp. This is defined as  a
       pointer  to  the  environment. The ISO C standard specifies invoking main() with two argu-
       ments, so implementations must support applications written this way. Since this volume of
       IEEE Std 1003.1-2001  defines  the global variable environ, which is also provided by his-
       torical implementations and can be used anywhere that envp could  be  used,  there  is  no
       functional  need  for  the  envp  argument.  Applications should use the getenv() function
       rather than accessing the environment directly via either envp or environ. Implementations
       are  required  to support the two-argument calling sequence, but this does not prohibit an
       implementation from supporting envp as an optional third argument.

       This volume of IEEE Std 1003.1-2001 specifies that signals set to SIG_IGN  remain  set  to
       SIG_IGN,  and that the process signal mask be unchanged across an exec. This is consistent
       with historical implementations, and it permits some useful  functionality,  such  as  the
       nohup  command. However, it should be noted that many existing applications wrongly assume
       that they start with certain signals set to the default action and/or unblocked.  In  par-
       ticular,  applications  written with a simpler signal model that does not include blocking
       of signals, such as the one in the ISO C standard, may not behave properly if invoked with
       some  signals  blocked.  Therefore, it is best not to block or ignore signals across execs
       without explicit reason to do so, and especially not to  block  signals  across  execs  of
       arbitrary (not closely co-operating) programs.

       The  exec  functions always save the value of the effective user ID and effective group ID
       of the process at the completion of the exec, whether or not the set-user-ID or  the  set-
       group-ID bit of the process image file is set.

       The  statement  about  argv[]  and  envp[] being constants is included to make explicit to
       future writers of language bindings that these objects are completely constant. Due  to  a
       limitation  of  the  ISO C  standard, it is not possible to state that idea in standard C.
       Specifying two levels of const- qualification for the argv[] and envp[] parameters for the
       exec functions may seem to be the natural choice, given that these functions do not modify
       either the array of pointers or the characters to which  the  function  points,  but  this
       would disallow existing correct code. Instead, only the array of pointers is noted as con-
       stant. The table of assignment compatibility for dst= src derived from the ISO C  standard
       summarizes the compatibility:

             dst:                char *[] const char *[] char *const[] const char *const[]
             src:
             char *[]            VALID    -              VALID         -
             const char *[]      -        VALID          -             VALID
             char * const []     -        -              VALID         -
             const char *const[] -        -              -             VALID

       Since  all  existing  code has a source type matching the first row, the column that gives
       the most valid combinations is the third column. The only other possibility is the  fourth
       column, but using it would require a cast on the argv or envp arguments. It is unfortunate
       that the fourth column cannot be used, because the declaration a  non-expert  would  natu-
       rally use would be that in the second row.

       The  ISO C  standard and this volume of IEEE Std 1003.1-2001 do not conflict on the use of
       environ, but some historical implementations of environ may cause a conflict.  As long  as
       environ is treated in the same way as an entry point (for example, fork()), it conforms to
       both standards.  A library can contain fork(), but if there  is  a  user-provided  fork(),
       that  fork() is given precedence and no problem ensues. The situation is similar for envi-
       ron: the definition in this volume of IEEE Std 1003.1-2001 is to be used if  there  is  no
       user-provided  environ  to  take  precedence.  At least three implementations are known to
       exist that solve this problem.

       E2BIG  The limit {ARG_MAX} applies not just to the size of the argument list, but  to  the
              sum of that and the size of the environment list.

       EFAULT Some  historical systems return [EFAULT] rather than [ENOEXEC] when the new process
              image file is corrupted. They are non-conforming.

       EINVAL This error condition was added to IEEE Std 1003.1-2001 to allow  an  implementation
              to detect executable files generated for different architectures, and indicate this
              situation to the application. Historical implementations of shells,  execvp(),  and
              execlp()  that  encounter an [ENOEXEC] error will execute a shell on the assumption
              that the file is a shell script. This will not produce the desired effect when  the
              file  is a valid executable for a different architecture. An implementation may now
              choose to avoid this problem by returning [EINVAL] when a valid  executable  for  a
              different architecture is encountered. Some historical implementations return [EIN-
              VAL] to indicate that the path argument contains a character with  the  high  order
              bit  set. The standard developers chose to deviate from historical practice for the
              following reasons:

               1. The new utilization of [EINVAL] will provide some measure  of  utility  to  the
                  user community.


               2. Historical  use of [EINVAL] is not acceptable in an internationalized operating
                  environment.


       ENAMETOOLONG
              Since the file pathname may be constructed by taking elements in the PATH  variable
              and  putting  them  together  with the filename, the [ENAMETOOLONG] error condition
              could also be reached this way.

       ETXTBSY
              System V returns this error when the executable file is currently open for  writing
              by some process. This volume of IEEE Std 1003.1-2001 neither requires nor prohibits
              this behavior.


       Other systems (such as System V) may return [EINTR] from exec.  This is not  addressed  by
       this  volume  of  IEEE Std 1003.1-2001,  but implementations may have a window between the
       call to exec and the time that a signal could cause one of the exec calls to  return  with
       [EINTR].

       An explicit statement regarding the floating-point environment (as defined in the <fenv.h>
       header) was added to make it clear that the  floating-point  environment  is  set  to  its
       default  when  a call to one of the exec functions succeeds.  The requirements for inheri-
       tance or setting to the default for other process and thread start-up functions is covered
       by more generic statements in their descriptions and can be summarized as follows:

       posix_spawn()
              Set to default.

       fork() Inherit.

       pthread_create()
              Inherit.


FUTURE DIRECTIONS
       None.

SEE ALSO
       alarm() , atexit() , chmod() , close() , exit() , fcntl() , fork() , fstatvfs() , getenv()
       , getitimer() , getrlimit() , mmap() , nice() , posix_spawn() , posix_trace_eventid_open()
       ,  posix_trace_shutdown()  , posix_trace_trid_eventid_open() , putenv() , semop() , setlo-
       cale() , shmat() , sigaction() , sigaltstack() , sigpending() , sigprocmask() , system() ,
       times()  , ulimit() , umask() , the Base Definitions volume of IEEE Std 1003.1-2001, Chap-
       ter 11, General Terminal Interface, <unistd.h>

COPYRIGHT
       Portions of this text are reprinted and  reproduced  in  electronic  form  from  IEEE  Std
       1003.1,  2003  Edition,  Standard  for Information Technology -- Portable Operating System
       Interface (POSIX), The Open Group Base Specifications Issue 6, Copyright (C) 2001-2003  by
       the  Institute  of  Electrical  and  Electronics Engineers, Inc and The Open Group. In the
       event of any discrepancy between this version and the original IEEE  and  The  Open  Group
       Standard, the original IEEE and The Open Group Standard is the referee document. The orig-
       inal Standard can be obtained online at http://www.opengroup.org/unix/online.html .



POSIX                                          2003                                       EXEC(P)