当前位置: 首页 > news >正文

【Linux 进程】进程程序替换详解

文章目录

      • 1.进程替换的六个库函数
      • 2.execl

1.进程替换的六个库函数

  • 使用 man 3 execl 进行查询,3表示 Linux 中的3号手册,即为库函数(例如C标准库中的库函数,printfmalloc

  • man 1: 用户命令(在shell中可以执行的命令,如 ls, cp

  • man 2: 系统调用(由内核提供的接口,如 open, read, fork

在这里插入图片描述

2.execl

🍎参数介绍
pathname:表示要替换程序的路径(绝对路径或者相对路径都可);
arg:命令行参数的第一个参数,一般是程序名本身;
...:表示可变参数,按照要求填写命令行参数即可
注意:结尾一定要以 NULL,表示结束标志;

execl的返回值我们不用关心,因为只要程序替换成功,旧的代码将不再执行,如果后续的代码执行了,说明替换失败。

int execl(const char *pathname, const char *arg, .../* (char  *) NULL */);

在这里插入图片描述

  • 小案例:使用 ls -a -l来替换程序代码
#include <stdio.h>
#include <unistd.h>int main()
{printf("the program begin\n");execl("/usr/bin/ls", "ls", "-a","-l", NULL);printf("the program end\n");return 0;
}

》运行结果如下:
程序替换成功,原来的程序代码 the program end 已经被替换成为 ls -a -l
在这里插入图片描述


  • 多进程版本:子进程中进行程序替换,父进程正常执行
    下面这个代码案例说明,虽然刚开始父子进程是共享同一块代码的内存区域的,但是当子进程发生程序替换要对代码进行修改时,此时OS会发生写时拷贝,在物理内存上新建一块内存区域,首先把父进程的代码进行复制,然后再把子进程要替换的代码加载进来。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>int main()
{printf("the program ...  begin\n");pid_t id =fork();// child processif (id == 0){sleep(2);execl("/usr/bin/ls", "ls", "-l", "-a", NULL);exit(123);}// father processint status = 0;pid_t wid = waitpid(id, &status, 0);if (wid > 0){printf("the father wait child  success, the child exitcode:%d\n", WEXITSTATUS(status));}printf("the program ...  end\n");return 0;
}

》运行结果如下:
在这里插入图片描述

http://www.dtcms.com/a/352392.html

相关文章:

  • 8.26网络编程——Modbus TCP
  • Git 高级技巧:利用 Cherry Pick 实现远程仓库的同步合并
  • 【自然语言处理与大模型】微调数据集如何构建
  • docker 的网络
  • shell默认命令替代、fzf
  • RCC_APB2PeriphClockCmd
  • sdi开发说明
  • 推荐系统王树森(三)粗排精排
  • STM32的Sg90舵机
  • Python入门教程之字符串类型
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(20):文法+单词第7回2
  • iPhone 17 Pro 全新配色确定,首款折叠屏 iPhone 将配备 Touch ID 及四颗镜头
  • 【测试需求分析】-需求类型的初步分析(二)
  • 【NuGet】引用nuget包后构建项目简单解析
  • day41-动静分离
  • 数字时代下的智能信息传播引擎
  • 仿真干货|解析Abaqus AMD的兼容与并行效率问题
  • 基于硅基流动API构建智能聊天应用的完整指南
  • 使用QML的Rectangle组件的边框属性
  • `stat` 系统调用详解
  • 学习碎片02
  • Firefox Relay 体验
  • Redis支持事务吗?了解Redis的持久化机制吗?
  • 面试八股文之——Java集合
  • 115、【OS】【Nuttx】【周边】效果呈现方案解析:重定向命令
  • Python编程快速上手—让繁琐工作自动化
  • 论文阅读-CompletionFormer
  • (我与爬虫的较量)码上爬第5题
  • JDK 8 → JDK 17 升级说明书(面向 Spring Boot / Spring Cloud / Spring )
  • Filter过滤器入门