首页 > 系统相关 >Linux中的exec族函数

Linux中的exec族函数

时间:2024-08-25 16:57:48浏览次数:13  
标签:bin ps const 函数 exec envp char Linux 环境变量

exec 系列函数用于替换当前进程的用户空间代码和数据,从而执行一个新的程序。调用 exec 系列函数不会创建新的进程,但会用新程序的代码和数据替换当前进程,因此调用 exec 后,进程的 ID 保持不变,但进程的行为变为执行新的程序

exec 系列函数有六个,分别是:

execl

int execl(const char *path, const char *arg, ...);

功能:使用指定的路径名执行新程序,参数一个一个列出,最后一个参数必须为 NULL 以标记结束。

execv

int execv(const char *path, char *const argv[]);

功能:使用指定的路径名执行新程序,参数以数组的形式传递。

execle

int execle(const char *path, const char *arg, ..., char *const envp[]);

功能:与 execl 类似,但可以传递环境变量数组 envp

execve

int execve(const char *path, char *const argv[], char *const envp[]);

功能:与 execv 类似,但可以传递环境变量数组 envpexecve 是真正的系统调用。

execlp

int execlp(const char *file, const char *arg, ...);

功能:与 execl 类似,但使用文件名 file 作为参数,当文件名中不含 / 时,会根据 PATH 环境变量寻找可执行文件。

execvp

int execvp(const char *file, char *const argv[]);

功能:与 execv 类似,但使用文件名 file 作为参数,当文件名中不含 / 时,会根据 PATH 环境变量寻找可执行文件。

函数参数解析

路径名 vs. 文件名

使用路径名的函数(如 execl, execv, execle, execve)需要明确指定可执行文件的完整路径。

使用文件名的函数(如 execlp, execvp)会根据 PATH 环境变量查找可执行文件。

参数表传递

l 表示 list:参数需要一个一个列出。

v 表示 vector:参数以数组形式传递。

环境变量

e 结尾的函数(如 execle, execve)可以传递一个环境变量数组。

没有 e 结尾的函数则继承父进程的环境变量。

代码示例

char *const ps_argv[] = {"ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL};
char *const ps_envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};

// 使用不同的 exec 函数执行 ps 命令
execl("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
execv("/bin/ps", ps_argv);
execle("/bin/ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL, ps_envp);
execve("/bin/ps", ps_argv, ps_envp);
execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
execvp("ps", ps_argv);

ps_argv[]:

这是一个参数数组,传递给 ps 命令,用于指定显示进程信息的格式。

"ps" 是命令名。

"-o" 是选项,用于指定自定义输出格式。

"pid,ppid,pgrp,session,tpgid,comm"

指定了输出的字段(进程ID、父进程ID、进程组ID、会话ID、控制终端的进程组ID、命令名)。

NULL 是数组的结束标志。

ps_envp[]:

这是一个环境变量数组,传递给 ps 命令。

"PATH=/bin:/usr/bin" 指定了查找可执行文件的路径。

"TERM=console" 设置终端类型为 console

NULL 是数组的结束标志

execl

  • 使用绝对路径 /bin/ps 执行 ps 命令。
  • 参数依次为 "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm",最后 NULL 结束。
  • 适用于知道完整路径并手动列出所有参数的情况。

execv

  • 使用绝对路径 /bin/ps 执行 ps 命令。
  • 参数通过数组 ps_argv[] 传递。
  • 适用于需要动态构建参数列表的情况。

execle

  • execl 类似,但额外传递了环境变量数组 ps_envp[]
  • 适用于需要在新程序中设置特定环境变量的情况。

execve

  • execv 类似,但额外传递了环境变量数组 ps_envp[]
  • 这是底层的系统调用函数,通常其他 exec 函数也是调用它实现的。

execlp

  • execl 类似,但只提供文件名 "ps" 而非路径。
  • 系统会根据 PATH 环境变量来查找 ps 的可执行文件位置。
  • 适用于不想指定绝对路径、依赖系统自动查找的情况。

execvp

  • execv 类似,但只提供文件名 "ps" 而非路径。
  • 系统会根据 PATH 环境变量来查找 ps 的可执行文件位置。

代码执行效果

在每种 exec 函数调用成功后,当前进程的用户空间代码和数据将被新的 ps 程序替换,进程会从 ps 程序的启动例程开始执行。

如果 exec 调用失败,函数会返回 -1 并设置 errno 以指示错误原因。

因为 exec 系列函数不会创建新进程,所以进程 ID 不会变化。

标签:bin,ps,const,函数,exec,envp,char,Linux,环境变量
From: https://blog.csdn.net/weixin_62409078/article/details/141368792

相关文章

  • [vue3] vue3 setup函数
    从语法上看,CompositionAPI提供了一个setup启动函数作为逻辑组织的入口,提供了响应式API,提供了生命周期函数以及依赖注入的接口,通过调用函数来声明一个组件。OptionsAPI选项式API在props、data、methods、computed等选项中定义变量;在组件初始化阶段,Vue.js内部处理这......
  • 【Linux】并发与并行:理解多任务处理的核心概念
    文章目录并发与并行:理解多任务处理的核心概念1.什么是并发?2.什么是并行?3.并发与并行的区别4.并发与并行的共同点与挑战5.选择并发还是并行?6.总结并发与并行:理解多任务处理的核心概念在现代计算中,性能和效率是关键问题。为了提高处理能力,计算机系统利用了并......
  • 【Linux】理解操作系统中的进程状态:阻塞、挂起、运行
    理解操作系统中的进程状态:阻塞、挂起、运行1.进程状态概述2.阻塞(Blocked)3.挂起(Suspended)4.运行(Running)5.状态转换关系6.总结理解操作系统中的进程状态:阻塞、挂起、运行操作系统是管理计算机硬件和软件资源的核心部分,而进程管理则是操作系统中最重要的功能......
  • Linux 进程 | 进程地址空间
    文章目录进程地址空间程序地址空间进程地址空间进程地址空间程序地址空间地址空间一共有如下的几个区域,从下到上地址逐渐增加,其中栈区的空间是从上往下使用,即从高地址往低地址增长;堆区的空间是从下往上使用,即从低地址往高地址增长,需要注意的是,在不同位操作系统下......
  • Linux内核——内核源码的探索+教你如何系统认识Linux内核源码树(推荐方式+推荐工具+推
    Linux全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,该操作系统是由LinusTorvalds于1991年10月5号首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。严格地讲,Linux单指操作系统的内核,加上用户空间的应用程......
  • C++函数调用栈从何而来
    竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~个人主页:rainInSunny | 个人专栏:C++那些事儿、Qt那些事儿目录写在前面原理综述x86架构函数调用栈分析如何获取rbp寄存器的值总结写在前面  程序员对函数调用栈是再熟悉不过了,无论是使用IDE调试还是GDB等工具进行调试,都离......
  • 最全!万字长文总结opencv-python常用函数(一)
    文章目录一,简介:二,图像的基础操作:2.1,图像的读取显示与保存2.1.1图像的读取cv2.imread:2.1.2图像的显示cv2.imshow与等待cv2.waitKey:2.1.3图像保存cv2.imwrite:2.2,图像属性获取:2.3,图像裁剪cv2.selectROI:2.4,图像通道的拆分cv2.split:2.5,图像通道的合并cv2.merge:三,图像的数值......
  • C++函数调用栈从何而来
    竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~个人主页:rainInSunny | 个人专栏:C++那些事儿、Qt那些事儿文章目录写在前面原理综述x86架构函数调用栈分析如何获取rbp寄存器的值总结写在前面  程序员对函数调用栈是再熟悉不过了,无论是使用IDE调试还是GDB......
  • linux下试验中间件canal的example示例-binlog日志的实时获取显示以及阿里巴巴中间件ca
    一、linux下试验中间件canal的example示例-binlog日志的实时获取显示    今天重装mysql后,进行了canal的再次试验,原来用的mysql5.7,今天重装直接换了5.6算了。反正测试服务器的mysql也不常用。canal启动后日志显示examplepreparetofindstartpositionjustshowmaste......
  • C语言函数介绍(上)
    函数概念库函数标准库和头文件库函数的使用方法头文件包含库函数文档的一般格式自定义函数函数的语法形式函数例子形参和实参实参形参实参和形参的关系return语句数组做函数参数函数概念数学中我们其实就见过函数的概念,比如:一次函数y=kx+b,k和b都是常数,给⼀个......