进程程序替换
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。
当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。
调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。
替换函数
5个库函数+1个系统调用接口 三个参数:新的程序执行路径 程序运行参数 自己设定的环境变量
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 execvpe(const char *file, char *const argv[],char *const envp[]);
execl和execv区别:程序运行参数的不同设置方式
- execl("/bin/ls","ls","-a","-l",NULL);
- char* argv[]={"ls","-a","-l",NULL}; execv("/bin/ls",argv);
execl和execlp区别:新的程序是否需要带位置,指定程序所在位置
- execl("/bin/ls",...)
- execlp("ls",...) 注意:不给路径针对于在PATH环境变量中添加指定路径 比如 命令可以不添加路径 会默认通过环境变量找到对应的程序 自己写的程序还是需要添加路径
execl和execle区别:当前进程的环境变量是否由自己来设置
- execl("/bin/ls",...) ; 使用当前默认就有的环境变量
- char* env[]={"MYVAL=1000",NULL}; execle("/bin/ls",...,NULL,env)