exec加载器
作用:
在子进程里面运行全新的代码。
如何运行新代码?
我们可以在if(ret == 0)里面运行,但是比较麻烦。
所有有了exec加载器。
exec函数族
execve是系统函数
execl,execv,execle,execlp,execvp是库函数
execve函数
函数原型
#include <unistd.h>
int execve(const char *filename, char *const argv[],char *const envp[]);
功能
向子进程空间加载新程序代码(编译后的机器指令)
参数
const char *filename:新程序(可执行文件)所在的路径名
char *const argv[]: 传给main函数的参数,例如传递命令行参数
char *const envp[]:环境变量表
返回值
函数调用成功不返回,调用失败返回-1,errno被设置。
代码演示
我们在当前路径编写需要在子进程里面运行的代码:
新文件:
new_process.c
#include <stdio.h>
#include <stdlib.h>
//extern char ** environ; //环境变量表
int main(int argc,char **argv,char ** environ)
{
int i = 0;
for(i = 0;i<argc;i++)
{
printf("%s",argv[i]);
}
printf("\n---------------------------------\n");
for(i = 0;NULL !=environ[i];i++)
{
printf("%s\n",environ[i]);
}
printf("\n---------------------------------\n");
return 0;
}
exec.c文件
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc,char ** argv)
{
pid_t ret = 0;
ret = fork();
if(ret >0)
{
sleep(1);
}
else if(ret == 0)
{
//函数原型int execve(const char *filename, char *const argv[],char *const envp[]);
extern char** environ;
execve("./new_process",argv,environ);
}
return 0;
}
子进程打印环境变量表。
运行结果为:
中间部分环境变量省略截图
那么我们对于上面代码进行详细说明说明:
exec的作用:将新程序代码加载(拷贝)到子进程的内存空间,替换掉原有的与父进程一模一样的代码和数据,让子进程空间运行新的代码
程序如何运行
命令行执行
在命令执行./a.out :
一:窗口进程先fork出子进程空间
二:调用exec函数加载./a.out 并把命令行参数和环境变量表传递给新程序的main函数的形参
双击快捷图标
一:图形界面进程fork出子进程空间
二:调用exec函数,加载快捷图标所指向程序的代码
以图形界面方式运行时,就没有命令行参数,会传递环境变量表。