目录
一、引入
二、程序替换的原理
三、替换函数
(一)execl
(二)execv
(三)execle
四、环境变量
程序替换(也称为程序加载或程序执行)是指将一个程序从磁盘(或其他存储介质)中读取到内存中,然后用它来替换当前正在运行的进程的代码和数据。
man excel //命令查看
#include `
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[]);
man execl
man execve
int execl(const char *path, const char *arg, ...);
#include
#include//execl的头文件
int main()
{
pid_t id = fork();
if(id == 0)
{
printf("pid: %d, exec command begin\n",getpid());
sleep(2);
execl("/usr/bin/ls","ls","-a","-l","-n",NULL); //最后必须以NULL结尾
printf("pid: %d, exec command end\n",getpid());
}
else{
//父进程
pid_t rid = waitpid(-1, NULL, 0);
if(rid > 0)
{
printf("wait success, rid: %d\n", rid);
}
else if(rid == 0)
{
printf("child is alive, wait again, father do other thing....\n");
}
else{
printf("wait failed!\n");
}
}
return 0;
}
int execv(const char *path, char *const argv[]);
#include
#include//exec的头文件
#include//exit的头文件
int main()
{
pid_t id =fork();
if(id == 0)
{
//子进程
char *const argv[]={"ls","-a","-l",NULL};
printf("pid: %d, exec command begin\n",getpid());
execv("/usr/bin/ls",argv);
printf("pid: %d, exec command end\n",getpid());
exit(1);
}
return 0;
}
int execle(const char *path, const char *arg, ...,char *const envp[]);
envp
参数是一个指向字符串数组的指针,表示新程序的环境变量。这个数组以NULL结尾 #include
#include//exec的头文件
#include//exit的头文件
#include
int main()
{
char* const myenv[]={
"MYVAL1=111111",
"MYVAL2=222222",
"MYVAL3=333333",
NULL
};
pid_t id =fork();
if(id == 0)
{
//子进程
printf("pid: %d, exec command begin\n",getpid());
execle("./test","test","-a","-b",NULL,myenv);
printf("pid: %d, exec command end\n",getpid());
exit(1);
}
return 0;
}
#include
using namespace std;
int main(int argc, char *argv[],char *env[])
{
cout<
.PHONY:all
all:test process
test:test.cc
g++ -o $@ $^ -std=c++11
process:process.c
gcc -o $@ $^ -std=c99
.PHONY:clean
clean:
rm -f process test
通过地址空间可以让子进程继承父进程的环境变量数据
程序替换,只替换新程序的代码和数据,环境变量不会被替换!!!