The exec family of system calls
The exec family of system calls replaces the program executed by a process.
When a process calls exec, all code (text)
and data in the process is lost and replaced with the executable of the new program.
Although all data is replaced, all open file descriptors remains open after
calling exec unless explicitly set to close-on-exec.
In the below diagram a process is executing Program 1. The program calls exec
to replace the program executed by the process to Program 2.
execlp
The execlp system call duplicates the actions of the shell in searching
for an executable file if the specified file name does not contain a slash (/)
character. The search path is the path specified in the environment by the PATH
variable. If this variable isn’t specified, the default path ":/bin:/usr/bin"
is used.
The execlp system call can be used when the number of arguments to the new
program is known at compile time. If the number of arguments is not known at
compile time, use execvp.
#include <unistd.h>
int execlp(const char *file, const char *arg, ...);- file
 - Name of the program to execute.
 - Remaining arguments
 - The 
const char *argand subsequent ellipses can be thought of asarg0, arg1, ..., argn. Together they describe a list of one or more pointers to null-terminated strings that represent the argument list available to the executed program. The first argument, by convention, should point to the filename associated with the file being executed. The list of arguments must be terminated by a NULL pointer. 
Example
In processes-and-ipc/examples/src/execlp_ls.c you find the following example program
demonstrating how execv can be used.
#include <unistd.h> // execlp()
#include <stdio.h>  // perror()
#include <stdlib.h> // EXIT_SUCCESS, EXIT_FAILURE
int main(void) {
  execlp("ls", "ls", "-l", NULL);
  perror("Return from execlp() not expected");
  exit(EXIT_FAILURE);
}The program uses execlp to search the PATH for an executable file named ls
and passing
-l as argument to the new program. The new program is the same program used by
the shell command ls to list files in a directory.
Use make to compile:
makeRun the program.
./bin/execlp_lsYou should see something similar to this in the terminal.
-rw-r--r--@  1 karl  staff  410 Jan 27 21:16 Makefile
drwxr-xr-x  17 karl  staff  578 Jan 28 22:08 bin
drwxr-xr-x   3 karl  staff  102 Dec  1  2016 data
drwxr-xr-x   2 karl  staff   68 Jan 28 22:08 obj
drwxr-xr-x  17 karl  staff  578 Jan 28 22:08 src- path
 - The path to the new program executable.
 - file
 - The name of the program executable
path 
execvp
The execvp system call will duplicate the actions of the shell in searching
for an executable file if the specified file name does not contain a slash (/)
character. The search path is the path specified in the environment by the PATH
variable. If this variable isn’t specified, the default path ":/bin:/usr/bin"
is used. In addition, certain errors are treated specially.
#include <unistd.h>
int execvp(const char *file, char *const argv[]);- file
 - Name of the program to execute.
 - argv
 - Argument vector. 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.
 
Example
In processes-and-ipc/examples/src/execvp_ls.c you find the following example program
demonstrating how execvp can be used.
#include <unistd.h> // execvp()
#include <stdio.h>  // perror()
#include <stdlib.h> // EXIT_SUCCESS, EXIT_FAILURE
int main(void) {
  char *const cmd[] = {"ls", "-l", NULL};
  execvp(cmd[0], cmd);
  perror("Return from execvp() not expected");
  exit(EXIT_FAILURE);
}The program uses execvp to search the PATH for an executable file named ls
and passing
-l as argument to the new program. The new program is the same program used by
the shell command ls to list files in a directory. In comparison to using
execv we don’t have to provide the full path to ls when using execvp, only
the name of the executable.
Use make to compile:
makeRun the program.
./bin/execvp_lsYou should see something similar to this in the terminal.
total 8
-rw-r--r--@ 1 abcd1234  staff  410 Jan 27 21:16 Makefile
drwxr-xr-x  5 abcd1234  staff  170 Jan 27 21:17 bin
drwxr-xr-x  2 abcd1234  staff   68 Jan 27 21:17 obj
drwxr-xr-x  5 abcd1234  staff  170 Jan 27 21:16 srcexecv
In comparison to execvp the execv system call doesn’t search the PATH.
Instead, the full path to the new executable must be specified. .
#include <unistd.h>
int execv(const char *path, char *const argv[]);- path
 - The path to the new program executable.
 - argv
 - Argument vector. The 
argvargument is an array of character pointers to null-terminated strings. The last member of this array must be a null pointer. These strings constitute the argument list available to the new process image. The value inargv[0]should point to the filename of the executable for the new program. 
Example
In processes-and-ipc/examples/src/execv_ls.c you find the following example program
demonstrating how execv can be used.
#include <unistd.h> // execv()
#include <stdio.h>  // perror()
#include <stdlib.h> // EXIT_SUCCESS, EXIT_FAILURE
int main() {
  char *const argv[] = {"/bin/ls", "-l", NULL};
  execv(argv[0], argv);
  perror("Return from execv() not expected");
  exit(EXIT_FAILURE);
}The program uses execv to replace itself with the /bin/ls program passing
-l as argument to the new program. The new program is the same program used by
the shell command ls to list files in a directory.
Use make to compile:
makeRun the program.
./bin/execv_lsYou should see something similar to this in the terminal.
total 8
-rw-r--r--@ 1 abcd1234  staff  410 Jan 27 21:16 Makefile
drwxr-xr-x  5 abcd1234  staff  170 Jan 27 21:17 bin
drwxr-xr-x  2 abcd1234  staff   68 Jan 27 21:17 obj
drwxr-xr-x  5 abcd1234  staff  170 Jan 27 21:16 src