exec加载器,execve函数,程序如何运行(进程控制)【linux】(zl)

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函数,加载快捷图标所指向程序的代码
以图形界面方式运行时,就没有命令行参数,会传递环境变量表。

发布了163 篇原创文章 · 获赞 94 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43648751/article/details/104495119