一:什么是进程替换?
定义:
进程替换,是指用一个新进程来替换此时正执行的进程。新进程从头开始执行自己的代码。
例子:
我们有一个父进程A,在父进程A中有一个子进程B
一般来说,子进程是执行父进程的程序代码
但我们这个时候将一个新的程序赋给子进程B,这个时候父进程A和子进程B就相当于两个独立的程序,各自运行了
简单来说:就是让父进程中的某个子进程独立运行其他程序
二:如何进行进程替换?
我们使用六个进程替换的系统调用,他们分别是
execl,execlp,execle,execv,execvp,execvpe
我们经过观察发现int exec都是相同的,不同的只是后面几个字母
为了方便大家理解,我们从最基础的两个使用开始
execl:
execl("绝对路径","使用方法",NULL);
举例:
execl("/usr/bin/ls", "ls", "-a", "-l", "-i", NULL);
execv:
execv("绝对路径","指针数组")(备注:指针数组需要自己定义)
举例:
char* const argv[NUM] = {
(char*)"ls",
(char*)"-a",
(char*)"-i",
(char*)"-l",
NULL};
execv("/usr/bin/ls", argv);
有些小伙伴就要说了:替换一个程序还要打根目录,烦不烦啊!
所以这个时候,我们的P兄弟就出来了
他们就是execlp和execvp
他们不需要打根目录,进程根据此进程名自动去环境变量中遍历查找该进程的路径,直接能在当前目录生成
execlp("ls", "ls", "-a", "-l", "-i", NULL);
char* const argv[NUM] = {
(char*)"ls",
(char*)"-a",
(char*)"-i",
(char*)"-l",
NULL};
execvp("ls", argv);
最后也就是execle和execlvpe,就是我们可以使用自己写的程序,通过环境变量来进行替换
execle:
execle("绝对或相对路径",“进程名字”,“方法”,NULL,“环境变量”)
char* const env[NUM] = {
(char*)"MY_ENV=2001",
(char*)"YOU_ENV=2002",
NULL
};
//这里路径可以是绝对路径,也可以是相对路径
execle("./myproc", "myproc", "-b", NULL, env);
execlvpe:
execlvpe(“进程路径”,“名字+方法+NULL的指针数组”,“存放环境变量的指针数组”)
char* const envp[NUM] = {
(char*)"MY_ENV=2001",
(char*)"YOU_ENV=2002",
NULL
};
//argv
char* const argv[NUM] = {
(char*)"myproc",
(char*)"-a",
NULL
};
//execvpe("myproc", argv, envp);
execvpe("myproc", argv, envp);