进程程序替换:
1.为什么要使用进程程序替换:
父进程创建子进程时,子进程与父进程的代码段相同,
实例:
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t ret=fork();
printf("i am Proc \n");
return 0;
}
由此可见子进程和父进程执行的结果一致。如果我们想让子进程执行不同的结果时,就让其调用进程程序替换的接口,从而让其执行不一样的代码。
2.进程程序替换的原理:
不创建新的进程,替换正在运行的进程,仅仅替换进程的代码块、数据段,并且更新堆栈。
3.实现的函数:
exec函数簇:
(1)int execl(const char* path,const char *arg……)
参数:
path:带有路径的可执行程序(需要路径),替换为该程序
arg:给程序传递命令行参数
第一个命令行参数是程序本身
最后一个参数以NULL结尾
返回值:
成功没有返回值,这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
失败:返回-1;
调用错误
调用成功了!
(2)int execlp(const char *file,const char *arg ……)
参数:
file:可执行程序,路径可带可以不带
arg:传递给可执行程序的命令行参数,第一个参数是可执行程序本身,以NULL结尾
返回值:
成功就加载调用的程序并开始执行
错误:返回-1
**若函数名中带有“p”,可以使用环境变量,无需全写路径,即函数会自动搜索可执行程序,不用写路径。
若函数中带有“l”,传递给可执行程序的参数是以可变参数列表的方式传递的
第一个参数:需要可执行程序本身
若需要传递多个参数,使用“ ,”进行隔离,参数列表的末尾以NULL结尾。
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("i am main \n ");
int ret=execlp("test","test",NULL);
if(ret<0)
{
perror("execlp error");
printf("cannot see this line ");
}
return 0;
}
~
执行成功
(3) int execle(const char *path,const char *arg, …… char *const envp[])
参数:
path:带路径的可执行程序。
arg:传递给可执行程序的命令,第一个参数是可执行程序本身, 若需要传递多个参数,使用“ ,”进行隔离,参数列表的末尾以NULL结尾。
envp:传递的环境变量,需要自己组织环境变量。
返回值:成功则直接从调用的函数开始
失败:返回-1
**若函数名中带有 “ e”,则调用该函数时,需要自己传入环境变量。
执行错误:
#include<unistd.h>
#include<stdio.h>
int main()
{
printf("i am main \n ");
int ret=execle("/usr/bin/ls","-ls",NULL,NULL);
if(ret<0)
{
perror("excle error");
return 0;
printf("cannot print this line! \n");
}
return 0;
}
执行成功
(4)int execv(const char *path,char *const argv[])
参数:
path:带路径的可执行程序
argv: 第一个是传递给可执行程序的命令行参数,多个参数就放入到数组中,末尾以NULL结尾
返回值:
成功就从新加载的函数执行
失败:返回-1
#include<unistd.h>
#include<stdio.h>
int main()
{
char *arr[10]={NULL};
arr[0]="ls";
arr[1]=NULL;
int ret=execv("/usr/bin/ls",arr);
if(ret<0)
{
perror("execv !");
printf("cannot printf thie line! ");
return 0;
}
return 0;
}
~
执行成功
(5)
int execve(const char *path,char *const argv[],char *coosnt envp[])
参数:
path:带路径的可执行程序(必须携带)
argv:传递给可执行程序的参数,以指针数组的形式传递
第一个参数:可执行程序自身,其余的参数放入数组 argv中,末尾以NULL结束
envp:需要传入的环境变量,需自行组织。
返回值:
成功则直接进入调用的函数执行
失败:返回-1;
传入的参数少了环境变量。
environ:
每个程序都收到一个环境表,其是一个字符指针数组,每个指针指向一个以‘ \0’结尾的环境字符串
获取环境变量:
#include<stdio.h>
int main(int argc,char *argv[],char *env[])
{
int i=0;
for(;env[i];i++)
{
printf("%s \n",env[i]);
}
return 0;
}
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int main()
{
extern char **environ;
char *p[10]={NULL};
p[0]="pwd" ;
p[1]=NULL;
int ret=execve("/usr/bin/pwd",p,environ);
if(ret<0)
{
perror("execve error");
printf("cannot printf this line!");
return 0;
}
return 0;
}
成功调用。