| .TH EXEC 3 |
| .SH NAME |
| exec, execl, _clock, _privates, _nprivates \- execute a file |
| .SH SYNOPSIS |
| .B #include <u.h> |
| .br |
| .B #include <libc.h> |
| .PP |
| .nf |
| .B |
| int exec(char *name, char* argv[]) |
| .PP |
| .B |
| int execl(char *name, ...) |
| .PP |
| .B |
| long *_clock; |
| .PP |
| .B |
| void **_privates; |
| .PP |
| .B |
| int _nprivates; |
| .fi |
| .SH DESCRIPTION |
| .I Exec |
| and |
| .I execl |
| overlay the calling process with the named file, then |
| transfer to the entry point of the image of the file. |
| .PP |
| .I Name |
| points to the name of the file |
| to be executed; it must not be a directory, and the permissions |
| must allow the current user to execute it |
| (see |
| .IR stat (3)). |
| It should also be a valid binary image, as defined in the |
| .IR a.out (6) |
| for the current machine architecture, |
| or a shell script |
| (see |
| .IR rc (1)). |
| The first line of a |
| shell script must begin with |
| .L #! |
| followed by the name of the program to interpret the file |
| and any initial arguments to that program, for example |
| .IP |
| .EX |
| #!/bin/rc |
| ls | mc |
| .EE |
| .PP |
| When a C program is executed, |
| it is called as follows: |
| .IP |
| .EX |
| void main(int argc, char *argv[]) |
| .EE |
| .PP |
| .I Argv |
| is a copy of the array of argument pointers passed to |
| .IR exec ; |
| that array must end in a null pointer, and |
| .I argc |
| is the number of elements before the null pointer. |
| By convention, the first argument should be the name of |
| the program to be executed. |
| .I Execl |
| is like |
| .I exec |
| except that |
| .I argv |
| will be an array of the parameters that follow |
| .I name |
| in the call. The last argument to |
| .I execl |
| must be a null pointer. |
| .PP |
| For a file beginning |
| .BR #! , |
| the arguments passed to the program |
| .RB ( /bin/rc |
| in the example above) will be the name of the file being |
| executed, any arguments on the |
| .B #! |
| line, the name of the file again, |
| and finally the second and subsequent arguments given to the original |
| .I exec |
| call. |
| The result honors the two conventions of a program accepting as argument |
| a file to be interpreted and |
| .B argv[0] |
| naming the file being |
| executed. |
| .PP |
| Most attributes of the calling process are carried |
| into the result; in particular, |
| files remain open across |
| .I exec |
| (except those opened with |
| .B OCEXEC |
| OR'd |
| into the open mode; see |
| .IR open (3)); |
| and the working directory and environment |
| (see |
| .IR env (3)) |
| remain the same. |
| However, a newly |
| .I exec'ed |
| process has no notification handler |
| (see |
| .IR notify (3)). |
| .PP |
| When the new program begins, the global cell |
| .B _clock |
| is set to the address of a cell that keeps approximate time |
| expended by the process at user level. |
| The time is measured in milliseconds but is updated at |
| a system-dependent lower rate. |
| This clock is typically used by the profiler but is available |
| to all programs. |
| .PP |
| The global cell |
| .B _privates |
| points to an array of |
| .B _nprivates |
| elements of per-process private data. |
| This storage is private for each process, even if the processes share data segments. |
| .PP |
| The above conventions apply to C programs; the raw system |
| interface to the new image is as follows: |
| the word pointed to by the stack pointer is |
| .BR argc ; |
| the words beyond that are the zeroth and subsequent elements |
| of |
| .BR argv , |
| followed by a terminating null pointer; and |
| the return register (e.g. |
| .B R0 |
| on the 68020) contains the address of the clock. |
| .SH SOURCE |
| .B /usr/local/plan9/src/libc/9syscall |
| .br |
| .B /usr/local/plan9/src/libc/port/execl.c |
| .SH SEE ALSO |
| .IR prof (1), |
| .IR intro (3), |
| .IR stat (3) |
| .SH DIAGNOSTICS |
| If these functions fail, they return and set |
| .IR errstr . |
| There can be no return from a successful |
| .I exec |
| or |
| .IR execl ; |
| the calling image is lost. |