What is the difference between the functions of the exec family of system calls like exec and execve?
There is no exec
system call -- this is usually used to refer to all the execXX
calls as a group. They all do essentially the same thing: loading a new program into the current process, and provide it with arguments and environment variables. The differences are in how the program is found, how the arguments are specified, and where the environment comes from.
The calls with
v
in the name take an array parameter to specify theargv[]
array of the new program. The end of the arguments is indicated by an array element containingNULL
.The calls with
l
in the name take the arguments of the new program as a variable-length argument list to the function itself. The end of the arguments is indicated by a(char *)NULL
argument. You should always include the type cast, becauseNULL
is allowed to be an integer constant, and default argument conversions when calling a variadic function won't convert that to a pointer.The calls with
e
in the name take an extra argument (or arguments in thel
case) to provide the environment of the new program; otherwise, the program inherits the current process's environment. This is provided in the same way as theargv
array: an array forexecve()
, separate arguments forexecle()
.The calls with
p
in the name search thePATH
environment variable to find the program if it doesn't have a directory in it (i.e. it doesn't contain a/
character). Otherwise, the program name is always treated as a path to the executable.FreeBSD 5.2 added another variant:
execvP
(with uppercaseP
). This is likeexecvp()
, but instead of getting the search path from thePATH
environment variable, it's an explicit parameter to the function:
int execvP(const char *file, const char *search_path, char *const argv[]);
Use man exec
and read:
The execv(), execvp(), and execvpe() functions provide an array of pointers to
null-terminated strings that represent the argument list available to the new program.
The first argument, by convention, should point to the filename associated with the file
being executed. The array of pointers must be terminated by a NULL pointer.
execv
int execv(const char *path, char *const argv[]);
So you pass an array as parameters
int execle(const char *path, const char *arg,
..., char * const envp[]);
Almost the same, but not as an array, but rather as a list of values (strings), followed by an array the designates the environment.
Here:
int execvp(const char *file, char *const argv[]);
You are calling a file, without path, so it expects you to be already in the right path
before calling.
Last but not least:
int execve(const char *filename, char *const argv[],
char *const envp[]);
Similar to previous one, but now you have two arrays, for arguments and environment variables.
Since all of these function belongs to exec() family, let me differentiate
according to extra characters
with the meanings,
1.execve():
p : not present => name of the program to run will be taken from pathname
v : present => argument will be passed as array
e : present => environment will be taken from envp argument
2.execle():
p : not present => name of the program to run will be taken from pathname
l : present => argument will be passed as list
e : present => environment will be taken from envp argument
3.execlp():
p : present => name of the program to run will be taken from filename
specified or system will search for program file
in PATH
variable.
l : present => argument will be passed as list
e : not present => environment will be taken from caller's environ
4.execvp():
p : present => name of the program to run will be taken from filename
specified or system will search for program file
in PATH
variable.
v : present => argument will be passed as array
e : not present => environment will be taken from caller's environ
5.execv():
p : not present => name of the program to run will be taken from pathname
v : present => argument will be passed as array
e : not present => environment will be taken from caller's environ
6.execl():
p : not present => name of the program to run will be taken from pathname
l : present => argument will be passed as list
e : not present => environment will be taken from caller's environ