程序替换
引言
在Linux操作系统中,exec函数族是实现程序替换的关键工具。程序替换是指一个进程将自身的执行映像替换为另一个程序的过程。这种机制为进程提供了动态加载新程序的能力,是Unix和Linux系统中进程管理的基石。本文将深入探讨exec函数的六个成员,分别是execve、execv、execle、execl、execvp和execlp。
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* file, char *const argv[],char *const envp[]);
- execl
简介
execl与execle类似,但不允许指定环境变量。它只接受可变数量的命令行参数。
使用示例
//int execl(const char* path,const char* arg, ...);
//l:list 列表
//path:程序的绝对或相对路径
//arg: 命令怎么写,arg怎么写,空格替换为逗号
//结尾必须是NULL
#include <unistd.h>
int main() {
execl("./my_program", "arg1", "arg2", NULL);
return 0;
}
- execlp
简介
execlp类似于execvp,但不允许传递环境变量。它接受可变数量的命令行参数。
使用示例
//int execlp(const char* file,const char* arg, ...);
//path:自动找到执行程序的路径,可带路径或不带
//例:execlp("ls","ls","-a","-l",NULL);
//结尾必须是NULL
#include <unistd.h>
int main() {
execlp("ls","ls","-a","-l",NULL);
return 0;
}
- execle
简介
execle允许程序员传递环境变量。它需要提供程序名称、命令行参数以及显式指定的环境变量数组。
使用示例
//例:execle("./xxx","xxx","-c","-v","-w",NULL, Myenv); Myenv 彻底替换环境变量
//例:execle("./xxx","xxx","-c","-v","-w",NULL, environ); environ 继承父进程得环境变量
//可变参数结尾必须是NULL
#include <unistd.h>
int main() {
char *argv[] = {"./my_program", "arg1", "arg2", NULL};
char *envp[] = {"VAR1=value1", "VAR2=value2", NULL};
execle("./my_program", "arg1", "arg2", NULL, envp);
return 0;
}
- execv
简介
execv是execve的简化版本,它只需要两个参数:程序名称和命令行参数数组。
使用示例
//v:vector 字符串指针数组 指针本身不可修改
//argv:传字符串指针数组
//例:execvp("/usr/bin/ls", myargv);
#include <unistd.h>
int main() {
char *argv[] = {"./my_program", "arg1", "arg2", NULL};
execv("./my_program", argv);
return 0;
}
- execvp
简介
execvp通过在系统的PATH中查找可执行文件,以文件名而不是文件路径的形式来执行程序。它接受程序名称和命令行参数数组。
使用示例
//int execvp(const char* file, char *const argv[]); char* const myargv[] = {
//path:自动找到执行程序的路径,可带路径或不带 "ls","-a","-l",NULL
//例:execvp("ls", myargv); };
#include <unistd.h>
int main() {
char *argv[] = {"my_program", "arg1", "arg2", NULL};
execvp("my_program", argv);
return 0;
}
- execve
简介
execve是exec函数族中最为底层和灵活的成员。它接受三个参数:程序名称、命令行参数数组和环境变量数组。这使得程序员可以全面控制新程序的执行环境。
使用示例
//int execve(const char* file, char *const argv[],char *const envp[]);
#include <unistd.h>
int main() {
char *argv[] = {"./my_program", "arg1", "arg2", NULL};
char *envp[] = {"VAR1=value1", "VAR2=value2", NULL};
execve("./my_program", argv, envp);
return 0;
}
结论
通过深入了解exec函数族的这六个成员,我们能够更好地理解Linux中程序替换的机制。不同的函数提供了不同层次的灵活性和功能,使得程序员可以根据需求选择最适合的函数。这些函数为Linux系统提供了强大的工具,使得进程能够在运行时动态地加载和执行不同的程序,为系统的可扩展性和灵活性提供了支持。