123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- .TH EXEC 2
- .SH NAME
- exec, execl, execac, _privates, _nprivates, _tos \- execute a file
- .SH SYNOPSIS
- .B #include <u.h>
- .br
- .B #include <libc.h>
- .PP
- .nf
- .B
- void* exec(char *name, char* argv[])
- .PP
- .B
- void* execl(char *name, ...)
- .PP
- .B
- void* execac(int core, char *name, char* argv[])
- .PP
- .B
- void **_privates;
- .PP
- .B
- int _nprivates;
- .PP
- .B
- #include <tos.h>
- .PP
- .ft L
- typedef struct Tos Tos;
- struct Tos {
- struct { ... } prof; /* profiling data */
- uvlong cyclefreq; /* cycle clock frequency */
- vlong kcycles; /* kernel cycles */
- vlong pcycles; /* process cycles (kernel + user) */
- ulong pid; /* process id */
- ulong clock; /* profiling clock */
- /* top of stack is here */
- };
- .PP
- .B
- extern Tos *_tos;
- .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 (2)).
- 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
- .I Execac
- is like
- .I exec
- except that it moves the process to an AC. When
- .I core
- is zero, the process is allocated to a TC. When
- .I core
- is positive, the process is allocated to that particular core number
- (using an AC role). When
- .I core
- is less than zero, the kernel picks a suitable core (with the AC role)
- for the process.
- .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 (2));
- 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 (2)).
- .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
- When the new program begins, the global pointer
- .B _tos
- is set to the address of a structure
- that holds information
- allowing accurate time keeping and clock reading in user space.
- These data are updated by the kernel during of the life of the process,
- including across
- .IR rfork s
- and
- .IR exec s.
- If there is a user-space accessible fast clock (a processor
- cycle counter),
- .B cyclefreq
- will be set to its frequency in Hz.
- .B Kcycles
- .RB ( pcycles )
- counts the number of cycles
- this process has spent in kernel mode
- (kernel and user mode).
- .B Pid
- is the current process's id.
- .B Clock
- is the user-profiling clock (see
- .IR prof (1)).
- Its 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 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 information.
- .SH SOURCE
- .B /sys/src/libc/9syscall
- .br
- .B /sys/src/libc/port/execl.c
- .SH SEE ALSO
- .IR prof (1),
- .IR intro (2),
- .IR stat (2)
- .SH DIAGNOSTICS
- If these functions fail, they return and set
- .IR errstr .
- There can be no return to the calling process from a successful
- .I exec
- or
- .IR execl ;
- the calling image is lost.
- .SH BUGS
- There is a large but finite limit on the size of an argment list,
- typically around 409,600 bytes.
- The kernel constant
- .B TSTKSIZ
- controls this.
|