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

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() 的区别以及使用注…...

Java/Kotlin双语革命性ORM框架Jimmer(一)——介绍与简单使用

概览 Jimmer是一个Java/Kotlin双语框架 包含一个革命性的ORM 以此ORM为基础打造了一套综合性方案解决方案&#xff0c;包括 DTO语言 更全面更强大的缓存机制&#xff0c;以及高度自动化的缓存一致性 更强大客户端文档和代码生成能力&#xff0c;包括Jimmer独创的远程异常 …...

剪辑学习整理

文章目录 1. 剪辑介绍 1. 剪辑介绍 剪辑可以干什么&#xff1f;剪辑分为哪些种类&#xff1f; https://www.bilibili.com/video/BV15r421p7aF/?spm_id_from333.337.search-card.all.click&vd_source5534adbd427e3b01c725714cd93961af 学完剪辑之后如何找工作or兼职&#…...

IDEA查看项目依赖包及其版本

一.IDEA将现有项目转换为Maven项目 在IntelliJ IDEA中,将现有项目转换为Maven项目是一个常见的需求,可以通过几种不同的方法来实现。Maven是一个强大的构建工具,它可以帮助自动化项目的构建过程,管理依赖关系,以及其他许多方面。 添加Maven支持 如果你的项目还没有pom.xm…...

centos虚拟机迁移没有ip的问题

故事背景&#xff0c;我们的centos虚拟机本来是好好的&#xff0c;但是拷贝到其他电脑上就不能分配ip&#xff0c;我个人觉得这个vmware他们软件应该搞定这个啊&#xff0c;因为这个问题是每次都会出现的。 网络选桥接 网络启动失败 service network restart Restarting netw…...

Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

Java中的继承及相关概念

在 Java 中&#xff0c;继承是一种允许一个类继承另一个类的特性。通过继承&#xff0c;子类可以获取父类的属性和方法&#xff0c;这有助于减少代码冗余并提高代码的可维护性。以下是关于文件内容的相关分析和知识点总结&#xff1a; 一、继承的核心概念 1.继承的语法 Java …...

赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索

hello~朋友们&#xff01;好久不见&#xff01; 今天给大家带来赛博算命第三期——梅花易数的java实现 赛博算命系列文章&#xff1a; 周易六十四卦 掐指一算——小六壬 更多优质文章&#xff1a;个人主页 JAVA系列&#xff1a;JAVA 大佬们互三哦~互三必回&#xff01;&#xf…...

DNS攻击方式有哪些,应该采取哪些应对措施?

在当今数字化时代&#xff0c;网络已成为人们生活和工作不可或缺的一部分。而 DNS&#xff08;域名系统&#xff09;作为互联网的关键基础设施&#xff0c;如同电话簿一般&#xff0c;将人们易于记忆的域名转换为计算机能够识别的 IP 地址&#xff0c;让我们能够轻松访问各类网…...

即梦(Dreamina)技术浅析(六):多模态生成模型

多模态生成模型是即梦(Dreamina)的核心技术之一,旨在结合文本和图像信息,生成更符合用户需求的视觉内容。多模态生成模型通过整合不同类型的数据(如文本和图像),能够实现更丰富、更精准的生成效果。 1. 基本原理 1.1 多模态生成模型概述 多模态生成模型的目标是结合不…...

如何优化爬虫以提高搜索效率

在数据采集和网络爬虫领域&#xff0c;优化爬虫性能是提升数据采集效率的关键。随着网页结构的日益复杂和数据量的不断增长&#xff0c;高效的爬虫能够显著降低运行时间和资源成本。本文将详细介绍如何优化爬虫以提高搜索效率&#xff0c;包括选择合适的工具、优化代码逻辑、使…...

Node.js中http模块(二)

一、http模块 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer0) 方法&#xff0c;就能方便的把一台普通的电脑&#xff0c;变成一台 Web 服务器&#xff0c;从而对外提供 Web 资源服务。 二、域名和域名服务器 尽管 I…...

android selinux 问题

参考 Android Selinux介绍&#xff0c;如何添加selinux 权限SELinux权限-总结添加Selinux 权限/常见的Selinux 权限问题为何Android普通APP可以执行私有数据中的so文件&#xff0c;而system app却不可以&#xff1f;Android SELinux权限概念和配置说明Selinux中的APP分类Andro…...

递增三元组(蓝桥杯18F)

暴力求解&#xff1a; #include<iostream> using namespace std; int main() {int N;cin >> N;int* A new int[N];int* B new int[N];int* C new int[N];for (int i 0; i < N;i) {cin >> A[i];}for (int i 0; i < N; i) {cin >> B[i];}for…...

计算机毕业设计SparkStreaming+Kafka广告推荐系统 广告预测 广告数据分析可视化 广告爬虫 大数据毕业设计 深度学习 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

FreeCAD创建零件(系列1)

1、新建草图绘制1个矩形 2、画1个半圆弧 3、增加一个约束点 4、标注距离 5、将线段转为辅助线 将图中的线段切换为辅助线,线条颜色之后转为蓝色线。 6、离开草图...

韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系

韶音科技&#xff1a;消费电子行业售后服务实现数字化转型&#xff0c;重塑客户服务体系 在当今这个科技日新月异的时代&#xff0c;企业之间的竞争早已超越了单纯的产品质量比拼&#xff0c;**售后服务成为了衡量消费电子行业各品牌实力与客户满意度的关键一环。**深圳市韶音…...

mes系统对工业数字化转型起到重要作用,它的实际应用有哪些

一、生产计划与调度 在工业数字化转型中&#xff0c;MES 系统能够对生产计划进行高效的管理和调度。通过与企业资源计划&#xff08;ERP&#xff09;系统的集成&#xff0c;MES 可以获取生产订单信息&#xff0c;并根据生产设备的状态、人员安排以及物料供应情况等因素&#x…...

mongodb 使用内存过大分析

os 分析 内存使用 ps aux|head -1;ps aux|grep -v PID|sort -rn -k 4|head -10swap 使用 for i in $(ls /proc | grep "^[0-9]" | awk $0>100); do awk /Swap:/{aa$2}END{print "$i",a/1024"M"} /proc/$i/smaps;done| sort -k2nr | headmo…...

网络安全:挑战、技术与未来发展

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 在数字化时代&#xff0c;网络安全已成为全球关注的焦点。随着互联网的普及和信息技术的高速发展&#xff0c;网络攻击的…...

从零开始玩转Docker:轻松开启容器化之旅

一、什么是 Docker Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。简单来说&#xff0c;Docker 就像是一个超级 “快递箱”&#xff0c…...

Python Pandas(5):Pandas Excel 文件操作

Pandas 提供了丰富的 Excel 文件操作功能&#xff0c;帮助我们方便地读取和写入 .xls 和 .xlsx 文件&#xff0c;支持多表单、索引、列选择等复杂操作&#xff0c;是数据分析中必备的工具。 操作方法说明读取 Excel 文件pd.read_excel()读取 Excel 文件&#xff0c;返回 DataF…...

预算限制下R1推理模型的复制与LLM推理能力提升策略

摘要 在预算有限的情况下&#xff0c;复制R1推理模型并增强大型语言模型&#xff08;LLM&#xff09;的推理能力成为研究热点。本文介绍四种主要构建方法&#xff1a;微调预训练模型、设计轻量级架构、迁移学习及知识蒸馏。每种方法各有优势&#xff0c;适用于不同场景。同时&a…...

数据库基础练习4(有关索引,视图完整解答)

建立需要的表 学生表 mysql> create table studnet(sno int primary key auto_increment,sname varchar(30) not null unique,ssex varchar(2) check (ssex男 or ssex女) not null ,sage int not null,sdept varchar(10) default 计算机 not null); Query OK, 0 rows affe…...

【计组】实验五 J型指令设计实验

目录 一、实验目的 二、实验环境 三、实验原理 四、实验任务 代码 一、实验目的 1. 理解MIPS处理器指令格式及功能。 2. 掌握lw, sw, beq, bne, lui, j, jal指令格式与功能。 3. 掌握ModelSim和ISE\Vivado工具软件。 4. 掌握基本的测试代码编写和FPGA开发板使用方法。 …...

Redis03 - 高可用

Redis高可用 文章目录 Redis高可用一&#xff1a;主从复制 & 读写分离1&#xff1a;主从复制的作用2&#xff1a;主从复制原理2.1&#xff1a;全量复制2.2&#xff1a;增量复制&#xff08;环形缓冲区&#xff09; 3&#xff1a;主从复制实际演示3.1&#xff1a;基本流程准…...

SAP HCM自定义开发程序调用odata api 如何ping外网

网络&#xff1a;我们知道SAP系统一般是部署在内网&#xff0c;Successfactors是云系统&#xff0c;部署在公有云上面&#xff0c;那肯定是公网&#xff0c;那内网和外网数据传递就需要网络做相关的设置&#xff0c;今天遇到的问题是网络说已经把SAP系统映射到公网&#xff0c;…...

SAP HCM PFCG读取结构化权限参数

权限&#xff1a;HCM的权限分两套&#xff0c;一套是PFCG的普通权限&#xff0c;一套是结构化权限是根据组织ID限制访问权限的&#xff0c;今天我们讨论的话题如何把这两类的权限组合起来 场景&#xff1a;例如下载有个薪酬管理人员&#xff0c;他复制A和B部门&#xff0c;但是…...

Ubuntu 20.04配置网络

1&#xff0c;检查自己网络是否配通。 网络配置成功显示的网络图标 不成功的网络图标 如果看不见网络图标&#xff0c;可以使用ping命令。连接一下百度网。 ping www.baidu.com ping失败的样子 ping成功的样子 2&#xff0c;接下来进入正题&#xff0c;我们开始配置网络。 这…...

【hive】记一次hiveserver内存溢出排查,线程池未正确关闭导致

一、使用 MemoryAnalyzer软件打开hprof文件 很大有30G&#xff0c;win内存24GB&#xff0c;不用担心可以打开&#xff0c;ma软件能够生成索引文件&#xff0c;逐块分析内存&#xff0c;如下图。 大约需要4小时。 overview中开不到具体信息。 二、使用Leak Suspects功能继续…...