Linux 调用可执行程序
Linux 调用可执行程序
- 1. `system()` 函数
- 1.1 `system()` 函数的声明
- 1.2 `system()` 函数的不同场景返回值
- 1.3 `system()` 函数的代码示例
- 2. `exec()` 函数族
- 2.1 `exec()` 函数族的声明
- 2.2 `exec()` 函数族执行失败的情况
- 2.3 `exec()` 函数族的代码示例
- 3. `exec()` 与 `system()` 的区别以及使用注意事项
- 4. `exec()` 会创建新进程吗?新进程与原进程的关系
- 5. 总结
在 Linux 系统中,我们经常需要在一个程序中调用另一个可执行程序。这可以通过多种方式实现,其中最常用的两种方式是使用 system() 函数和 exec() 函数族
1. system() 函数
1.1 system() 函数的声明
system() 函数的声明如下:
#include <stdlib.h>int system(const char *command);
1.2 system() 函数的不同场景返回值
system() 函数用于执行一个 shell 命令。它的返回值表示命令执行的退出状态。
- 正常情况下,
system()函数返回执行的 shell 命令的退出状态。通常,0 表示成功,非 0 值表示失败。 - 如果
system()函数调用失败(例如,无法创建子进程或执行 shell 命令),则返回 -1。
1.3 system() 函数的代码示例
#include <stdio.h>
#include <stdlib.h>int main() {int ret = system("ls -l"); // 执行 ls -l 命令if (ret == 0) {printf("命令执行成功\n");} else if (ret == -1) {perror("system() 调用失败");} else {printf("命令执行失败,退出状态为 %d\n", ret);}return 0;
}
2. exec() 函数族
2.1 exec() 函数族的声明
exec() 函数族是一组函数,它们用于替换当前进程的映像,执行一个新的程序。exec() 函数族有很多不同的变体,它们的声明和参数略有不同,但功能基本相同。
以下是几个常用的 exec() 函数:
#include <unistd.h>int execl(const char *path, const char *arg0, ..., NULL);
int execlp(const char *file, const char *arg0, ..., NULL);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
2.2 exec() 函数族执行失败的情况
如果 exec() 函数族执行失败,则返回 -1,并设置 errno 来指示错误类型。常见的错误原因包括:
- 文件不存在:指定的程序文件不存在。
- 权限不足:当前用户没有执行指定程序的权限。
- 内存不足:无法加载新的程序映像。
- 参数错误:传递给
exec()函数的参数不正确。
2.3 exec() 函数族的代码示例
#include <stdio.h>
#include <unistd.h>int main() {// 使用 execlp() 函数执行 ls -l 命令execlp("ls", "ls", "-l", NULL);// 如果 execlp() 执行失败,则会执行以下代码perror("execlp() 调用失败");return 1; // 返回 1 表示程序执行失败
}
3. exec() 与 system() 的区别以及使用注意事项
- 功能:
system()函数用于执行一个 shell 命令,而exec()函数族用于替换当前进程的映像,执行一个新的程序。 - 返回值:
system()函数返回执行的 shell 命令的退出状态,而exec()函数族如果执行成功则不会返回,如果执行失败则返回 -1。 - 进程:
system()函数会创建一个新的子进程来执行 shell 命令,而exec()函数族则直接在当前进程中执行新的程序。
使用注意事项:
- 由于
system()函数会创建一个新的子进程,因此开销比exec()函数族要大。 system()函数执行的 shell 命令可能会受到 shell 注入攻击,因此应该避免使用用户提供的输入作为命令字符串。exec()函数族执行成功后,原进程的代码将不再执行,因此需要在调用exec()函数族之前做好必要的清理工作。
4. exec() 会创建新进程吗?新进程与原进程的关系
exec() 函数族不会创建新的进程。它会替换当前进程的映像,执行一个新的程序。这意味着原进程的代码、数据和堆栈都会被新的程序所覆盖。
新程序与原进程的关系:
- 进程 ID:新程序的进程 ID 与原进程相同。
- 父进程:新程序的父进程与原进程相同。
- 环境变量:新程序会继承原进程的环境变量。
- 文件描述符:新程序会继承原进程打开的文件描述符。
5. 总结
system() 函数和 exec() 函数族都是在 Linux 中调用可执行程序的常用方法。system() 函数使用简单,但开销较大,且存在安全风险;exec() 函数族效率高,但使用稍复杂
相关文章:
Linux 调用可执行程序
Linux 调用可执行程序 1. system() 函数1.1 system() 函数的声明1.2 system() 函数的不同场景返回值1.3 system() 函数的代码示例 2. exec() 函数族2.1 exec() 函数族的声明2.2 exec() 函数族执行失败的情况2.3 exec() 函数族的代码示例 3. exec() 与 system() 的区别以及使用注…...
MVCC面试怎么答
说到mvcc这个比较抽象的概念,很多人都有点束手无策。因为它实际上偏理论,实际应用中很难用到。但在面试中出现频率又很高,一问大部分都G。所以怎么精简回答并且能抓住重点就很关键了。往上详细解说MVCC的太多了,我这里没那么多废话…...
用Go实现 SSE 实时推送消息(消息通知)——思悟项目技术4
目录 简介 工作原理 例子 使用场景 简介 SSE(Server - Sent Events)是一种允许服务器向客户端实时推送更新的 Web 技术。是一种基于 HTTP 协议的单向通信机制,服务器可以在客户端建立连接后,持续不断地向客户端发送事件流。客…...
0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 0基础…...
vue3:动态渲染后端返回的图片
问: div classleft-png 这里我用css设置了他的背景图片,但是现在我希望改为后端返回的图片,怎么写? 后端返回数据: const centerdata {img:;xxxx,title,xxxx,num:xxxx}? 回答: 好的ÿ…...
DeepSeek小白初识指南
1.什么是DeepSeek? DeepSeek是一个基于大语言模型(LLM)的智能助手,能够处理自然语言理解、生成、对话等任务。它广泛应用于聊天机器人、内容生成、数据分析等领域。 2.DeepSeek和OpenAI等大模型差异? 虽然DeepSeek和Op…...
图像锐化(QT)
如果不使用OpenCV,我们可以直接使用Qt的QImage类对图像进行像素级操作来实现锐化。锐化算法的核心是通过卷积核(如拉普拉斯核)对图像进行处理,增强图像的边缘和细节。 以下是一个完整的Qt应用程序示例,展示如何使用Qt…...
38.社区信息管理系统(基于springboothtml)
目录 1.系统的受众说明 2.需求分析及相关技术 2.1设计目的 2.2社区信息管理系统的特点 2.3可行性分析 2.3.1技术可行性 2.3.2运行可行性 2.4系统设计 2.4.1系统功能分析 2.4.2管理员权限功能设计 2.4.3业主权限功能设计 2.5系统的技术介绍 2.5.1 Html 2.5.2 Aja…...
游戏引擎学习第98天
仓库:https://gitee.com/mrxiao_com/2d_game_2 开始进行一点回顾 今天的目标是继续实现正常贴图的操作,尽管目前我们还没有足够的光照信息来使其完全有用。昨日完成了正常贴图相关的基础工作,接下来将集中精力实现正常贴图的基本操作,并准备…...
音频知识基础
音频知识基础 声音属性声音度量人耳特性通道数音频数字化传输接口 声音属性 响度 响度是人耳对声音强弱的主观感受; 主要和声波的振幅相关,同时也和频率有一定关系; 音调 音调是人耳对声音高低的主观感受; 主要与频率相关&#…...
【AI赋能】蓝耘智算平台实战指南:3步构建企业级DeepSeek智能助手
蓝耘智算平台实战指南:3步构建企业级DeepSeek智能助手 引言:AI大模型时代的算力革命 在2025年全球AI技术峰会上,DeepSeek-R1凭借其开源架构与实时推理能力,成为首个通过图灵测试的中文大模型。该模型在语言理解、跨模态交互等维…...
LabVIEW无人机飞行状态监测系统
近年来,无人机在农业植保、电力巡检、应急救灾等多个领域得到了广泛应用。然而,传统的目视操控方式仍然存在以下三大问题: 飞行姿态的感知主要依赖操作者的经验; 飞行中突发的姿态异常难以及时发现; 飞行数据缺乏系统…...
DeepSeek模型架构及优化内容
DeepSeek v1版本 模型结构 DeepSeek LLM基本上遵循LLaMA的设计: 采⽤Pre-Norm结构,并使⽤RMSNorm函数. 利⽤SwiGLU作为Feed-Forward Network(FFN)的激活函数,中间层维度为8/3. 去除绝对位置编码,采⽤了…...
html语义化
常见语义化标签有: (1)页面结构标签:<header>、<nav>、<main>、<article>、<section>、<aside>、<footer> (2)文本语义标签:<h1>-<h6>…...
python学习第十四天之机器学习名词介绍
名词介绍 1. 常用术语解释2.常见机器学习任务3. 机器学习常见算法1. 监督学习(Supervised Learning)2. 非监督学习(Unsupervised Learning)3.深度学习4.**对比总结** 1. 常用术语解释 拟合(Fit)࿱…...
天津三石峰科技——汽车生产厂的设备振动检测项目案例
汽车产线有很多传动设备需要长期在线运行,会出现老化、疲劳、磨损等 问题,为了避免意外停机造成损失,需要加装一些健康监测设备,监测设备运 行状态。天津三石峰科技采用 12 通道振动信号采集卡(下图 1)对…...
汽车与AI深度融合:CES Asia 2025前瞻
在科技飞速发展的当下,汽车与AI的融合正成为行业变革的关键驱动力。近日,吉利、极氪、岚图、智己等多家车企纷纷官宣与DeepSeek模型深度融合,其中岚图知音更是将成为首个搭载该模型的量产车型,这无疑是汽车智能化进程中的重要里程…...
前端实现 GIF 图片循环播放
前言 使用 img 加载 GIF 图片,内容只会播放一次,之后就会自动暂停; 通过定时器在一段时间后重新加载图片的方式,会导致浏览器内存不断增大,并且可能会有闪烁、卡顿的问题; ImageDecoder WebCodecs API 的…...
React - 事件绑定this
在 React 中,this 的绑定是一个常见问题,尤其在类组件中使用事件处理函数时。JavaScript 中的 bind 函数用于设置函数调用时 this 的值。 bind 函数的作用 bind() 方法创建一个新的函数,当被调用时,其 this 关键字被设置为提供的…...
STM32系统架构介绍
STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射(特殊的存储器)2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司,…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
