C++执行系统命令的三种方式

C++ 执行系统命令可以使用以下几种方法:

1. 使用 system() 函数

system() 函数会调用操作系统的命令行处理器(如 /bin/sh)来执行命令。该函数的语法如下:

int system(const char *command);

其中,command 参数指定要执行的命令。

例如,以下代码将执行 ls 命令:

#include <iostream>

int main() {
  int status = system("ls");
  if (status != 0) {
    std::cout << "执行命令失败" << std::endl;
  }
  return 0;
}

system() 函数的返回值为命令的退出状态。如果命令执行成功,则返回值为 0。如果命令执行失败,则返回值为非 0 值。

2. 使用 popen() 函数

popen() 函数会创建一个管道,用于将命令的输入和输出与 C++ 程序进行连接。该函数的语法如下:

FILE *popen(const char *command, const char *mode);

其中,command 参数指定要执行的命令。mode 参数指定管道的模式,可以为 "r""w""rw"

popen() 函数返回一个 FILE 指针,指向管道。可以使用 fread() 函数从管道中读取命令的输出,使用 fwrite() 函数向管道中写入命令的输入。

例如,以下代码将执行 ls 命令,并将命令的输出写入到文件 output.txt 中:

#include <iostream>
#include <stdio.h>

int main() {
  FILE *fp = popen("ls", "w");
  if (fp == NULL) {
    std::cout << "创建管道失败" << std::endl;
    return 1;
  }

  // 将命令的输出写入到文件
  fwrite("Hello, world!\n", 1, 12, fp);

  // 关闭管道
  pclose(fp);

  return 0;
}

3. 使用 fork()exec() 函数

fork() 函数会创建一个子进程。exec() 函数会在子进程中执行指定的程序。

例如,以下代码将执行 ls 命令:

#include <iostream>
#include <unistd.h>

int main() {
  pid_t pid = fork();
  if (pid == 0) {
    // 子进程
    execlp("ls", "ls", NULL);
    std::cout << "执行命令失败" << std::endl;
    exit(1);
  } else if (pid < 0) {
    // 创建子进程失败
    std::cout << "创建子进程失败" << std::endl;
    return 1;
  } else {
    // 父进程
    waitpid(pid, NULL, 0);
  }

  return 0;
}

在这里插入图片描述

这三种方法各有优缺点。system() 函数是最简单的方法,但它不是很灵活。popen() 函数提供了更大的灵活性,可以控制命令的输入和输出。fork()exec() 函数提供了最强大的控制,可以直接控制子进程的执行。

具体选择哪种方法取决于具体的应用场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp点击按钮,防止按钮多次点击多次触发事件【防抖操作】

图片、 一、在根目录下新建common文件并创建common.js文件&#xff0c;输入下面代码 // 防止处理多次点击function noMultipleClicks(methods, info) {// methods是需要点击后需要执行的函数&#xff0c; info是点击需要传的参数let that this;if (that.noClick) {// 第一次点…

外包干了2年,技术退步明显...

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

用EasyStreamingServer将MP4模拟成RTSP流无声音的问题,可以改用EasyDarwin做文件模拟RTSP实时流,有声音!

之前有一篇博客介绍用EasyStreamingServer将文件模拟成RTSP实时流&#xff0c;提供给类似于智能分析服务、NVR等做实时录像《用软件模拟IPC的RTSP流&#xff0c;对接烟火识别算法服务&#xff0c;做实时的烟火检测、人员入侵检测、抽烟检测等算法》 但最近有人反馈MP4有声音&a…

SpringMVC异常处理机制

2.1 异常描述 在J2EE项目的开发中&#xff0c;不管是对底层的数据库操作过程&#xff0c;还是业务层的处理过程&#xff0c;还是控制层的处理过程&#xff0c;都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常&#xff0c;系统的代码耦合度高&a…

批发订货程序推荐 订货系统哪个好

订货系统是一种企业管理软件&#xff0c;可以让批发商、门店实时掌握客户订单的进度和完成情况&#xff0c;提高企业与客户之间的沟通效率&#xff0c;减少错误&#xff0c;节省时间和成本。因此&#xff0c;目前很多企业会选择订货系统来帮助提高业务效率&#xff0c;但目前市…

Vue脚手架 Vue CLI安装

目录 0.为什么要安装Vue CLI脚手架 1.配置方法 1.全局安装 (一次) 2.查看Vue版本&#xff08;一次&#xff09; 报错&#xff1a;出现禁止运行脚本 3.创建项目架子&#xff08;可多次&#xff09; 报错npm err! 问题&#xff1a;已知npm换过国内源&#xff0c;且进度条…

数据结构 | DFSBFS,Prim代码

树的DFS&BFS prim算法 图的DFS和BFS DFS

josef约瑟 电压继电器 DY-23C/60C 柜内安装,带板前接线底座

DY-20C、20D系列电压继电器型号&#xff1a; DY-21C电压继电器; DY-26C电压继电器; DY-22C电压继电器; DY-23C电压继电器; DY-28C电压继电器; DY-24C电压继电器; DY-29C电压继电器; DY-25C电压继电器; DY-27C电压继电器; DY-21D电压继电器; DY-26D电压继电器; DY-23D电压继电…

AI日报:谷歌Gemini Pro即将面向企业和开发者

文章目录 总览Gemini介绍 模型能力产品API其他产品Imagen2和其他新闻Duet AI 总览 现在&#xff0c;您可以免费访问Gemini Pro的API&#xff0c;这是谷歌最新大型语言模型的第一个版本。 Gemini 介绍 谷歌通过其API让企业和开发者第一次看到了其最强大的大型语言模型Gemini。…

数据分析为何要学统计学(11)——如何进行时间序列分析

时间序列是由随时间变化的值构成&#xff0c;如产品销量、气温数据等等&#xff0c;该数据集合是个有序序列&#xff0c;除了数值&#xff0c;没有其他因素。通过对时间序列展开分析&#xff0c;能够回答如下问题&#xff1a; &#xff08;1&#xff09;被研究对象的活动特征是…

DataFunSummit:2023年数据科学在线峰会-核心PPT资料下载

一、峰会简介 数据会说谎&#xff1f;如何正确的挖掘并使用数据&#xff1f;前沿的科学实验如何做&#xff1f;实验又是如何欺骗你的&#xff1f;数据中台如何发挥功效&#xff1f;用户增长有捷径吗&#xff1f;数据科学的最佳实践有哪些&#xff1f; 本次峰会共包含了&#…

四十六、Redis哨兵

目录 一、哨兵的作用及原理 1、哨兵的结构和作用如下&#xff1a; 2、服务状态监控 3、选举新的master 4、小结 二、RedisTemplate的哨兵模式 一、哨兵的作用及原理 Redis提供了哨兵&#xff08;Sentinel&#xff09;机制来实现主从集群的自动故障恢复。 1、哨兵的结构和作…

实用干货:再见ElementPlus,我有更好的了

大家好&#xff0c;我是大澈&#xff01; 本文约1200字&#xff0c;整篇阅读大约需要3分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试大礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff…

EasyExcel读取Excel数据(含多种方式)

目录 EasyExcel简介 使用EasyExcel进行读数据 引入依赖&#xff1a; EasyExcel提供了两种读取模式 使用 监听器 读取模式 1.创建一个实体类 2.创建监听器 代码 使用 同步读 读取模式 1.创建一个实体类 2.代码 添加导入数据库的逻辑 其实官方文档讲得很清楚&#xff…

基于YOLOv7算法的高精度实时水果目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时水果目标检测系统可用于日常生活中检测与定位苹果&#xff08;apple&#xff09;、香蕉&#xff08;banan&#xff09;、葡萄&#xff08;grape&#xff09;、橘子&#xff08;orange&#xff09;、菠萝&#xff08;pineapple&#…

【Linux进程控制(二)】进程程序替换(exec系列函数) and 自实现shell命令解释器

一、进程替换是什么&#xff1f; fork()之后&#xff0c;父子各自执行父进程代码 的一部分。如果子进程想执行全新程序 就会用到进程的程序替换来完成这个功能 程序替换&#xff1a;通过特定接口&#xff0c;加载磁盘 上的一个权限程序(代码和数据) 加载到调用进程的地址空间…

四六级高频词组12

目录 词组 其他链接 词组 501. &#xff08;a&#xff09; passion for 对…的热爱&#xff0c;热情 502. be patient with 对…耐心 503. pay for 赔偿&#xff0c; 付款&#xff0c; 报偿&#xff0c; 处罚 504. pay…for 付…的钱 505. &#xff08;be&#xff09; …

LabVIEW开发电能质量监测系统

LabVIEW开发电能质量监测系统 本研究基于LabVIEW开发了一个创新的电能质量监测系统&#xff0c;专注于暂态电能质量扰动信号的产生、分析与存储。该系统不仅模拟产生了电压骤降、电压波动、暂态振荡以及电压畸变等关键信号&#xff0c;还能够记录并存储这些扰动信号产生时的波…

数据库——审计及触发器

智能2112杨阳 一、目的与要求&#xff1a; 1.了解MySQL审计功能及实现方式 2.掌握触发器的工作原理、定义及操作方法 二、内容&#xff1a; 注&#xff1a; 在同一个触发器内编写多行代码&#xff0c;需要用结构begin ……end 函数current_user()获得当前登录用户名 1.…

cmake 从零开始源码安装(Ubuntu系统)

Ubuntu 系统安装 &#xff11;、安装编译工具和依赖库 ## 必要的 sudo apt install gsudo apt install make## 与make 同等级的构建工具&#xff0c;为了演示而安装的 sudo apt install ninja-build## 压缩工具库 sudo apt install unzip## 加密和传输(根据系统名称可能不一样…
最新文章