关于linux里面的exec系列
其实有六种以exec开头的函数,统称exec函数:exec 系列函数调用后直接替换当前进程的代码段成功执行 → 原有 main 函数后续代码永远不会运行只有调用失败函数才会返回继续往下执行。#include unistd.hint 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[]);#include unistd.hint 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);}其实p就是地址带p系统自动去 PATH 路径寻找 ls不用写/bin/ls以execlp和exevp举例#include unistd.h // exec系列函数头文件 #include stdio.h // printf perror int main() { printf(执行ls前\n); // execlp(程序名, argv0, argv1, argv2 ... , NULL); execlp(ls, ls, -l, NULL); // 只有execlp执行失败代码才会走到这里 perror(execlp失败); return 1; }ls想要运行的程序名称。ls传给 ls 程序的 argv [0]。操作系统规范代表程序自身名字常规和命令同名。-l传入命令参数等价 shell ls -lNULL强制不能省略标记参数列表结束。运行结果执行ls前total 48-rw-r--r-- 1 xq xq 239 Jul 30 18:41 ....-rwxr-xr-x 1 xq xq 8464 Jul 30 18:41......execvp#include unistd.h #include stdio.h int main() { printf(执行ps之前\n); //把所有参数放进字符串数组末尾必须NULL char *argv[] {ls, -l, NULL}; execvp(ls, argv); //失败才执行 perror(execvp失败); return 1; }这execvp函数和上面execlp函数结果是一样的相等于执行execlp(ls, ls, -l, NULL);argv[0] 程序名argv[1] 第一个参数argv[2] 第二个参数 ...argv[n] NULL // 必须以NULL结尾execlpl list 列表传参int execlp(const char *file, const char *arg, ... , (char*)NULL);execvpv vector 向量数组传参int execvp(const char *file, char *const argv[]);都是以argv【】的形式传参对于argv【0】是进程名可以随便起但是默认和要执行的进程名程序名一致