报名系统网站开发,旅游必去的10个地方,大连做网站优化价格,辽宁自适应网站建设公司首先#xff0c;exec 是 execute (意为:执行) 的缩写。 exec系列函数 各个“后缀”的意思#xff1a; l 为 list 可变参数列表、v 为 vector、p 为 PATH、e 为环境变量数组 envp execl#xff1a;l 为 list 可变参数列表 原型#xff1a;int execl(const char *path, cons… 首先exec 是 execute (意为:执行) 的缩写。 exec系列函数 各个“后缀”的意思 l 为 list 可变参数列表、v 为 vector、p 为 PATH、e 为环境变量数组 envp execll 为 list 可变参数列表 原型int execl(const char *path, const char *arg, ... /* (char *)NULL */); 功能加载并执行指定的可执行文件参数以变长参数列表的形式提供。 特点参数列表以NULL结尾。 使用示例 execl(/bin/echo, echo, Hello, world!, (char *)NULL);execlel 为 list 可变参数列表e 为环境变量数组 envp 原型int execle(const char *path, const char *arg, ... /* (char *)NULL */, char * const envp[]); 功能加载并执行指定的可执行文件参数以变长参数列表的形式提供并且可以指定环境变量数组。 特点参数列表以NULL结尾同时可以指定环境变量数组。 使用示例 char *envp[] {HELLOworld, USERroot, NULL};
execle(/bin/echo, echo, $HELLO, (char *)NULL, envp);execlpl 为 list 可变参数列表p 为 PATH 原型int execlp(const char *file, const char *arg, ... /* (char *)NULL */); 功能加载并执行指定的可执行文件参数以变长参数列表的形式提供并在PATH环境中查找可执行文件。 特点参数列表以NULL结尾使用PATH环境变量查找可执行文件。 使用示例 execlp(echo, echo, Hello, world!, (char *)NULL);execvv 为 vector 原型int execv(const char *path, char *const argv[]); 功能加载并执行指定的可执行文件参数以数组的形式提供。 特点参数数组以NULL结尾。 使用示例 char *args[] {/bin/echo, Hello, world!, NULL};
execv(/bin/echo, args);execvev 为 vectore 为环境变量数组 envp 原型int execve(const char *filename, char *const argv[], char *const envp[]); 功能加载并执行指定的可执行文件参数以数组的形式提供并且可以指定环境变量数组。 特点参数数组以NULL结尾同时可以指定环境变量数组。 使用示例 char *args[] {/bin/echo, Hello, world!, NULL};
char *envp[] {HELLOworld, USERroot, NULL};
execve(/bin/echo, args, envp);execvpv 为 vectorp 为 PATH 原型int execvp(const char *command, char *const argv[]); 功能加载并执行指定的可执行文件参数以数组的形式提供并在PATH环境中查找可执行文件。 特点参数数组以NULL结尾使用PATH环境变量查找可执行文件。 使用示例 char *args[] {echo, Hello, world!, NULL};
execvp(echo, args);关于 execl 和 execvl 和 v 的区别 execl 和 execv 这两个实际上没什么区别
可以看作一个使用 list 结构传参数一个使用 vector 结构传参数
execlp(/bin/ls, -l, -a, nullptr);
execv(/bin/ls, argv); // char* argv[] {ls, -l, -a, nullptr}; 关于 execlp 和 execvp p 有什么用 execlp 和 execvp 函数的 p 表示的就是 PATH 环境变量的意思带有 p 的这类函数不用写全路径只需写可执行程序名即可它们会在PATH 环境变量中查找可执行文件的位置而不需要提供完整的路径。 例如
execlp 该函数不要求写全路径只需要写命令名程序名即可他会自己到环境变量中找没有就报错
execlp(ls, ls, -l, -a, nullptr);该函数写了两次 ls内容一样但表达的语义不同
第一个 ls表示要执行的程序名称的字符串即该程序的名字用于告诉系统可以在PATH环境变量指定的目录中查找该文件
第二个 ls作为参数列表 argv数组 的第一个元素因为在 exec 系列函数中程序的名字需要作为参数列表的第一个元素。 关于 execve 和 execle e 有什么用 带 e 后缀说明该函数支持显式传递环境变量数组。 main 函数接收到环境变量表这张表就是该进程的环境变量表
若不显式传递即不用这两个带 e 后缀函数则子进程默认继承父进程的环境变量表
简单来说给子进程显式传新环境变量表则子进程就使用新表否则默认从父进程继承下来“初始”表 char *args[] {/bin/echo, Hello, world!, NULL};
char *envp[] {HELLOworld, USERroot, NULL};execve(/bin/echo, args, envp); // 给子进程显式传新环境变量表 envpexec 系列函数程序替换本身不会替换修改原进程中的 环境变量但可以通过带 e 后缀的 exec 函数显式传递新表并修改覆盖原表 一个进程的环境变量来源
1、默认继承子进程默认继承父进程全部环境变量表
2、显式传递父进程显示传递全新的环境变量表自己定义自己传递如 execle(…, …, env)子进程就用这张新表
3、新增环境变量进程通过 int putenv(char *env_string); 将环境变量 char *env_string 添加进当前环境变量表中或修改表中已存在的环境变量
putenv函数用于修改当前进程的环境变量。
这个函数允许你在程序运行时动态地添加或更改环境变量。
在 shell 进程中调用则修改 shell 的环境变量即我们的命令行窗口的全局环境变量表在自己创建的进程中调用则修改自己进程的环境变量 exec 系列函数都是库函数吗 实际上只有 execve 函数是真正的系统调用函数
其他的函数都是C语言库函数内部都封装调用了 execve 函数这几种函数只有传参方式的差别就是为了满足不同的应用场景。
以C标准库的 execl 函数为为例其底层的运行原理为
1、处理变长参数列表分配内存并存储在参数列表 argv 中
2、调用 execve 函数
3、释放内存如 argv 我们在 shell 中通过 man 命令查询手册