目录

1.进程替换不会创建新进程,因为进程替换只是将该进程的数据替换为指定的可执行程序。而进程PCB没有改变,所以不是新的进程,进程替换后不会发生进程pid改变。
2.进程替换后,如果替换成功后则替换函数下的代码不会执行,因为进程替换是覆盖式的替换,替换成功后进程原来的代码就消失了。同理在进程替换失败后会执行替换函数后的代码
3.进程替换函数在进程替换成功后不返回,函数的返回值表示替换失败
4.进程替换成功后,退出码为替换后的进程的退出码
“Linux--进程替换(execl、execlp、execv、execle)当我们fork()生成子进程后,子进程的代码与数据可以来自其他可执行程序。把磁盘上其他程序的数据以覆盖的形式给子进程。这样子进程就可以执行全新的程序了,这种现象称为程序替换。”
注意,就是原来的程序换成了ps程序,但是PCB没有改变,但是PCB里面的有些值被修改了,比如pcb中程序的名字换成了新进程的名字;
注意,"abc"可以, "/usr/bin/psxx"不可以;,如下:

- #include
- #include
- #include
-
- int main()
- {
- printf("main pid=%d\n",getpid());
- execl("/usr/bin/ps","ps","-f",(char *)0);
-
- printf("execl error\n");
- exit(0);
- }

只给文件名,不需要给文件路径,可以去环境变量PATH所指的位置去搜索;
echo $PATH
- #include
- #include
- #include
-
- int main()
- {
- printf("main pid=%d\n",getpid());
- execlp("ps","ps","-f",(char *)0);
-
- printf("execlp error\n");
- exit(0);
- }

这个execle多了一个环境变量;
- #include
- #include
- #include
-
- int main(int argc,char *argv[],char *envp[])
- {
- printf("main pid=%d\n",getpid());
- execle("/usr/bin/ps","ps","-f",(char *)0,envp);
-
- printf("execle error\n");
- exit(0);
- }

execv系列把参数都放在了一个数组中,然后把这个数组传递进去即可;
- #include
- #include
- #include
-
- int main(int argc,char *argv[],char *envp[])
- {
- printf("main pid=%d\n",getpid());
- char *myargv[]={"ps","-f",0};
- execv("/usr/bin/ps",myargv);
-
- printf("execv error\n");
- exit(0);
- }

第一个参数只要文件名,不要路径;
- #include
- #include
- #include
-
- int main(int argc,char *argv[],char *envp[])
- {
- printf("main pid=%d\n",getpid());
- char *myargv[]={"ps","-f",0};
- execvp("ps",myargv);
-
- printf("execvp error\n");
- exit(0);
- }

本质上,前面5个都是调用的这个系统调用execve;
- #include
- #include
- #include
-
- int main(int argc,char *argv[],char *envp[])
- {
- printf("main pid=%d\n",getpid());
- char *myargv[]={"ps","-f",0};
- execve("/usr/bin/ps",myargv,envp);
-
- printf("execve error\n");
- exit(0);
- }

替换函数前面的exec不变
l:参数采用列表
v:参数采用数组
p:不需要输入路径,在环境变量自动搜索
e:要导入自己的环境变量
所以execvp表示不需要输入路径,参数用数组传
execve表示需要输入路径,参数用数组传,自己维护环境变量
int execl ( const char* path , const char * arg ,...);int execlp ( const char* file , const char * arg ,...);int execle ( const char* path , const char * arg ,..., char* const envp []);int execv ( const char * path , char* const argv []);int execvp ( const char * file , char* const argv []);int execve ( const char * path , char* const argv [], char* const envp []); // 系统调用