网站编辑楼盘详情页怎么做,网站建设培训 通州,wordpress自定义注册页面模板,百度企业网盘目录
引言
1.单进程版程序替换
2.程序替换原理
3.6种替换函数介绍
3.1 函数返回值
3.2 命名理解
3.3 环境变量参数 引言 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)#xff0c;我们所创建的所有的子进程#xff0c;执行的代码#x…目录
引言
1.单进程版程序替换
2.程序替换原理
3.6种替换函数介绍
3.1 函数返回值
3.2 命名理解
3.3 环境变量参数 引言 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)我们所创建的所有的子进程执行的代码都是父进程代码的一部分如果我们想让子进程执行新的程序呢执行全新的代码和访问全新的数据不在和父进程有瓜葛这时子进程往往要调用一种exec函数以执行另一个程序。
1.单进程版程序替换
execl 介绍 第一个参数是要替换程序的路径。 第二个参数是可变参数列表这里以NULL结束命令行执行替换程序输入什么就传入什么。 代码示例将子进程替换为命令行中 ls -a -l 执行结果 可以发现子进程id发生进程程序替换时并没有改变并且没有执行代码中的 2.程序替换原理 当进程调用一种exec函数时从外存中将新程序替换掉该进程的用户空间代码和数据所以上面代码中第二个printf没有执行。从新程序的启动例程开始执行。且调用exec并不创建新进程所以调用exec前后子进程的id并未改变只是代码和数据替换。 3.6种替换函数介绍 #include unistd.h 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[]); 3.1 函数返回值 如果进程程序替换成功不会有返回值不会执行原程序调用替换后的代码。失败有返回值执行原程序调用替换后的代码。所以我们不需要接收返回值可以直接让原程序退出。
3.2 命名理解
这些函数原型看起来很容易混但只要掌握了规律就很好记。 l(list)表示参数采用可变参数列表用来传递命令行参数 v(vector)参数采用数据传递 p(path)从环境变量PATH中寻找程序 e(env)表示自己维护环境变量 exec调用举例
#include unistd.h
int main()
{char *const argv[] {ps, -ef, NULL};char *const envp[] {PATH/bin:/usr/bin, TERMconsole, NULL};execl(/bin/ps, ps, -ef, NULL);// 带p的可以使用环境变量PATH无需写全路径execlp(ps, ps, -ef, NULL);// 带e的需要自己组装环境变量execle(ps, ps, -ef, NULL, envp);execv(/bin/ps, argv);// 带p的可以使用环境变量PATH无需写全路径execvp(ps, argv);// 带e的需要自己组装环境变量execve(/bin/ps, argv, envp);exit(0);
}
事实上只有execve是真正的系统调用上面6个函数最终都调用 execve所以execve在man手册 第2节其它函数在man手册第3节。
3.3 环境变量参数 环境变量是由父进程传递给子进程的在程序替换时不会替换掉进程中环境变量所以要替换的进程环境变量与父进程环境变量是相同的如果不是传入自己定义的环境变量没有必要调用带e的程序替换函数。 char* const myenv[]{MYENY1111111111,MYENY2111111111,MYENY3111111111,MYENY4111111111,NULL};execle(./mytest,mytest,-a,-b,NULL,myenv);//传自己定义的环境变量,不是新增而是覆盖传递若传入的环境变量不是在原来环境变量中新增而是覆盖。
mytest.cc
1 #include iostream2 #include unistd.h3 4 //程序替换可以将命令行参数和环境变量传递到被替换的程序的main函数中5 6 int main(int argc,char* argv[],char* env[])7 {8 for(int i 0;iargc;i)9 {10 std::cout i -- argv[i] std::endl; 11 }12 13 //打印环境变量 指针数组 环境变量在系统中是全局存在的 父进程是bash的子进程 子进程环境变量是父进程给的14 for(int i 0;environ[i]!NULL;i)15 {16 std::couti : env[i]std::endl;17 }18 19 return 0;20 }结果 gitee链接
本篇结束