进程程序替换(原理及exec 函数簇)

    科技2025-06-06  71

    原理

    替换代码段和数据段,从磁盘加载新的代码段和数据段到物理内存,用页表映射回进程虚拟地址空间的代码段、数据段,同时应该将堆栈、命令行参数等变为最初状态,pid 不变、环境变量不变、

    应用

    exec 函数簇:多个 ecec 结构的函数

    int execl(const char* path, const char* arg,...) path: 带路径的可执行程序,绝对或相对路径 arg: 给可执行程序传递的参数,规定:第一个参数必须是可执行程序的名称 ...: 可变参数列表,参数列表要以 NULL 标志参数结束

    l :可变参数列表的函数,参数列表要以 NULL 标志参数结束

    int execlp(const char* file, const char* arg,...) file: 可执行文件的名称,可执行程序是必须在环境变量 PATH 当中可以找到的,也可以直接传入可执行程序的绝对路径

    p :如果带 p,要替换的程序可以直接给一个程序的名称,回去搜索当前环境变量

    int execle(const char* path, const char* arg,..., char* consst envp[]) envp: 给当前所要替换的程序设置环境变量,要以 NULL 结尾

    e :如果带有 e,则需要自己去组织环境变量的内容

    int execv(const char* path, const char* argv[]) argv: 传入字符数组指针,而不是可变参数列表

    v :如果带有 v,则表示需要传入的程序命令行参数为字符数组指针,而不是可变参数列表,字符数组依旧需要以 NULL 结尾

    其中,系统调用为 execve,其他的为库函数

    使用场景

    守护进程

    基本具备的条件:server 可执行程序,守护进程的程序 守护进程是由守护程序启动的,在守护进程当中,使用到了创建子进程+进程程序替换+进程间通信(判断子进程是否运行正常) 获取状态发现 server 可执行程序并没有更改,则认为 server 状态异常,执行策略就是重新创建子进程,让子进程程序替换,替换为新的 server 可执行程序

    server 可执行程序:通过进程间通信,每隔一段时间告诉父进程当前的状态

    shell终端 1.启动 bash 可执行程序 2.当用户输入命令时,创建子进程,子进程进程程序替换 3.在子进程进程程序替换时,如果是前台进程,则 bash 负责进程等待
    Processed: 0.009, SQL: 8