Linux中的exec族函数

news2025/3/11 6:24:08

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 不会变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计 教师科研管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

第1章-05-通过浏览器控制台安装JQuery.js库

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲。 🎉欢迎 👍点赞✍评论⭐收…

大数据背景下基于Python语言的单车租赁商业数据可视化分析

注:源码在最后,只是一次实验记录,不足之处请指教。 一 研究背景及意义 在大数据时代,商业领域的数据量迅速增长,如何有效地利用这些数据成为企业决策和优化成为重要的研究课题。单车租赁作为一种新兴的共享经济模式,其…

健韵坊(详细项目实战一)Spring系列 + Vue3

这一次来一个项目改造的项目实战,基于很久之前的一个demo项目,来实现一个改造优化和部署上线的项目实战。(就当是接手*山项目并且加以改造的一个实战吧。) 之前是一个关于运动的一个项目(其实之前连名字都没想好hhhh&…

vue3 响应式 API:watch()、watchEffect()

watch() 基本概念 watch()用于监视响应式数据的变化,并在数据变化时执行相应的回调函数。可以监视单个响应式数据、多个响应式数据的组合,或者一个计算属性。 返回值 返回一个函数,调用这个函数可以停止监视。 特点 watch() 默认是懒侦听的&…

【Linux网络】select函数

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 select函数介绍select函数参数介绍select函数返回值select的工作流程TCP服务器【多路复用版】 select函数介绍 在Linux网络编程中,select 函数是一种非常有用的IO多路复用技术&#xff0…

秃姐学AI系列之:LeNet + 代码实现

目录 LeNet MNIST数据集 LeNet模型图 ​编辑 总结 代码实现:卷积神经网络 LeNet LeNet(LeNet-5)由两个部分组成:卷积编码器核全连接层密集块 检查模型 LeNet 卷积神经网络里面最为著名的一个网络,80年代末提出…

【vue教程】七. Vue 的动画和过渡

文章目录 往期列表回顾本章涵盖知识点Vue 的内置动画系统基本的进入和离开过渡列表过渡 CSS 过渡CSS 过渡基础Vue 中的 CSS 过渡 JavaScript 动画使用 JavaScript 钩子 第三方动画库的使用集成 Animate.css 实例演示创建一个简单的动画应用 结语 往期列表 【vue教程】一. 环境…

iOS18升级出现白苹果、无法重启等问题,要怎么解决

随着苹果iOS 18系统beta版本的推出,不少用户在私信说升级后遇到了白苹果和无法重启等问题。这些问题不仅影响了大家的正常使用,还会导致数据丢失和系统崩溃。本文将详细介绍iOS 18升级后出现白苹果、无法重启等问题的原因及解决方法,帮助大家…

日期转时间濯

tfunction(date_str) local code ,time World:getTimeFromDateString(date_str) return time/(60*60*24) end print(t(2024-08-16)-t(2024-08-3))

指针 (四)

一 . 指针的使用和传值调用 (1)strlen 的模拟实现 库函数 strlen 的功能是求字符串长度,统计的是字符串中 \0 之前的字符个数,函数原格式如下: 我们的参数 str 接收到一个字符串的起始地址,然后开始统计…

JS 获取当前操作系统类型

在JavaScript中,‌直接获取用户的操作系统信息是不可能的,‌因为JavaScript主要运行在浏览器中,‌而浏览器出于安全和隐私的考虑,‌不会提供访问操作系统详细信息的API。‌ 但是,‌你可以通过分析用户代理字符串&…

数据库性能定位-慢sql定位、sql优化(docker容器实战)

安装好mysql数据之后,创建库的时候,要注意选择 字符集编码。如果没有选择好,你的库表存中文的时候,会字符集乱码。选择utf8mb4. 建表的时候,存储引擎 InnoDB、MyISAM mysql5.7及以后数据库,表的默认存储引…

官方招募 | 仓颉语言三方库社区建设全速启航,全球开发者、技术大神只等您!

Cangjie-TPC招募令 仓颉社区的小伙伴们,官方三方库(Cangjie-TPC)招募开始啦! Cangjie-TPC(https://gitcode.com/Cangjie-TPC) 是 Cangjie 社区用于汇集基于仓颉编程语言开发的开源三方库的主干仓&#xf…

JS获取当前浏览器名称

在JavaScript中,获取当前浏览器名称的方法并不是一个标准的功能,因为浏览器厂商并没有提供一个直接的API来获取浏览器的名称。但是,你可以通过分析用户代理字符串(User-Agent)来推断出浏览器的名称。 以下是一个简单的…

ArcGIS如何将投影坐标系转回为地理坐标系

有时候两个数据,一个为投影坐标系,另一个为地理坐标系时,在GIS软件中位置无法叠加到一起,这需要将两个或多个数据的坐标系统一,可以直接将地理坐标系的数据进行投影,或将投影坐标系转为地理坐标系。下面介绍…

视频号AI美女跳舞,轻松月入30000+,蓝海赛道,流量池巨大,起号猛

今天给大家分享的是一个男生比较感兴趣的内容,AI美女视频跳舞项目4.0版本,7天快速起号,实现每月30000的稳定收入. 大家刷抖音的时候,肯定都刷到过美女跳舞的视频,对吧?这种视频,不管在哪个平台…

电商项目DevOps一体化运维实战

主要讲了git和jkins的使用,其中maven的一个插件还挺好用的,主要可以用来查看哪些类没有使用,哪些导入的包是多余的等。这里展示一下用法。至于git和jkins的搭建后续再操作。 maven插件的使用: 编译后就可以在target下面看到这个h…

网络安全之XSS基础

从 XSS Payload 学习浏览器解码 xss payload 1.<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">1</a> 2.<a href"&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:…

代码随想录:动态规划6-10

62、不同路径 题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径…