1.进程替换的本质
更新 PCB中的内容,改变PCB对应的程序
2.进程替换的6个接口
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[]);
1)execvpe是系统调用接口,其余五个都是库函数,都是通过封装execvpe来实现的。
2)l和v的区别
l传递的是不定参,
v传递的是一个形参数组
3)有p和没有p的区别:
在于是否需要带路径,有p不需要带路径,没有p需要带路径,默认去PATH环境变量指定的路径下去找
此处可以使用export
4)有e和没有e的区别
在于是否需要初始化环境变量,有e表示需要初始化,没有e表示不需要
3.关于进程替换接口的使用演示:
param.c经过编译后会在程序替换中用到
param.c
#include<stdio.h>
int main(int argc,char* argv[],char* env[])
{
//argc:运行参数的个数
//argv:当前的运行参数
int i;
for(i=0;argv[i]!=NULL;++i)
{
printf("argv[%d]=%s\n",i,argv[i]);
}
for(i=0;env[i]!=NULL;++i)
{
printf("env[%d]=%s\n",i,env[i]);
}
return 0;
}
replace.c
#include<stdio.h>
#include<unistd.h>
//这个demo演示进程替换接口的基本使用和认识
//有e和没有e的区别在于是否需要初始化环境变量,有e表示需要初始化,没有e表示不需要
void test()
{
char* new_argv[]={"POWER","FACULTY","fast",NULL};
char* new_env[]={"VALUE1=100","MYVALUE=444",NULL};
printf("e和非e的区别:\n");
//execve:系统调用接口,是环境变量父子间进程通信的保障
//父进程将环境变量的值赋值给子进程
execve("./param",new_argv,new_env);
//传递程序本身的环境变量env,但需要将代码放到在main函数中,因为env是main函数的函数参数
//execve("./param",new_argv,env);
printf("I am lack of faculty!\n"); //因为程序替换,这一句不会被执行
}
/*
//有p和没有p的区别在于是否需要带路径,有p不需要带路径,没有p需要带路径,默认去PATH环境变量指定的路径下去找
void test()
{
char* new_argv[]={"param","pwd","-ls","cat",NULL};
printf("Hello 进程替换\n");
//对当前调用进程进行程序替换,去运行当前目录下的param程序
//将当前路径加入环境变量中,使用PATH,执行进程替换时就只需要程序名,不需要带路径
execvp("param",new_argv);
}
*/
/*
//l和v的区别:l传递的是一个不定参,
//v传递的是一个形参数组
void test()
{
char* new_argv[]={"param","pwd","-ls","cat",NULL};
printf("Hello 进程替换\n");
//对当前调用进程进行程序替换,去运行当前目录下的param程序
execv("./param",new_argv);
}
*/
/*
int execl(const char* path,const char * arg,...);
path:指定程序的绝对路径,
arg:参数,如果没有参数了就以NULL作为结尾
*/
/*
void test()
{
printf("Hello 进程替换\n");
//对当前调用进程进行程序替换,去运行当前目录下的param程序
execl("./param","param","cxp","-l","calloc",NULL);
//这句因为进程替换不会被执行
printf("这是进程替换后的下一个语句\n");
}
*/
/*
void test()
{
printf("Hello 进程替换\n");
//对当前调用进程进行程序替换,去运行ls程序
execl("/usr/bin/ls","ls","-l",NULL);
}
*/
int main(int argc,char* argv[],char* env[])
{
test();
return 0;
}
程序运行结果: