C++笔记之popen()和std_system()和std_async()执行系统命令比较
C++笔记之popen()和std_system()和std_async()执行系统命令比较
code review!
 
文章目录
- C++笔记之popen()和std_system()和std_async()执行系统命令比较
- 1.popen()
- 2.std::system()
- 3.std::async()——C++11提供的异步操作库,适合在多线程中执行外部命令,建议使用!
- std::async和std::future
 
- 4.system()和std::async结合使用
- 5.popen()和std::async结合使用
 
1.popen()

代码
#include <iostream>
#include <stdio.h>int main() {FILE* pipe = popen("ls -l", "r");if (!pipe) {std::cerr << "Error: popen() failed!" << std::endl;return 1;}char buffer[128];while (fgets(buffer, 128, pipe) != NULL) {std::cout << buffer;}pclose(pipe);return 0;
}
2.std::system()

代码
#include <iostream>
#include <cstdlib>int main() {int result = std::system("ls -l");if (result != 0) {std::cerr << "Error: std::system() failed!" << std::endl;return 1;}return 0;
}

3.std::async()——C++11提供的异步操作库,适合在多线程中执行外部命令,建议使用!


代码
#include <iostream>
#include <future>
#include <string>std::string execute_command(const std::string& cmd) {std::array<char, 128> buffer;std::string result;std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);if (!pipe) {throw std::runtime_error("popen() failed!");}while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {result += buffer.data();}return result;
}int main() {auto future_result = std::async(std::launch::async, execute_command, "ls -l");std::cout << future_result.get() << std::endl;return 0;
}
上面的代码会在新的线程中异步执行"ls -l"命令,并将输出结果存储在一个字符串中。通过std::async和std::future的组合,可以轻松地在多线程环境中执行外部命令,避免了阻塞主线程的问题。
std::async和std::future

4.system()和std::async结合使用

void Node::clicked_a_button(int var) {auto fut1 = std::async(std::launch::async, []() {system("/home/user/xxx.sh arg1 arg2");// or// system("rm -r *.txt");});fut1.wait();
}
这段代码是一个C++函数,涉及到多线程编程和系统调用。让我们逐行分析:
-  void Node::clicked_a_button(int var)是一个成员函数,可能属于一个类(Node),接受一个整数参数var。
-  auto fut1 = std::async(std::launch::async, []() { ... });创建了一个异步任务(使用std::async)并将其分配给名为fut1的std::future对象。这个异步任务使用std::launch::async策略,表示它应该在一个新的线程中异步执行。
-  system("/home/user/xxx.sh arg1 arg2");这是一个系统调用,用于执行外部的shell脚本(xxx.sh)并传递两个参数(arg1和arg2)。这个命令将在一个新的子进程中运行,通常用于执行外部命令。
-  fut1.wait();这一行等待异步任务(在fut1中)的完成。这会导致主线程阻塞,直到异步任务执行完毕。
需要注意的是,虽然std::async用于启动异步任务,但在此代码中,主线程仍然会等待异步任务完成,因为在 fut1.wait(); 处进行了显式等待。这意味着异步任务的效果仅在执行系统调用期间是异步的,而在 fut1.wait(); 处,主线程将被阻塞,直到系统调用完成。
这种用法可以用于在C++中启动外部进程或shell脚本,但需要小心,因为system函数在执行时会阻塞主线程,可能导致整个应用程序在执行外部命令时暂停。如果需要更多的并发性,可以考虑使用std::thread或其他多线程库来在后台执行系统调用,以便主线程可以继续执行其他任务。
5.popen()和std::async结合使用
- 1.执行外部shell脚本并传递参数的简单例程
 在C++中,您可以使用popen函数来执行外部Shell脚本,并使用std::async来异步执行它。下面是一个简单的例程,演示如何结合使用这两个功能来执行外部Shell脚本并传递参数。
#include <iostream>
#include <fstream>
#include <future>
#include <string>int executeShellScript(const std::string& scriptPath, const std::string& argument) {std::string command = scriptPath + " " + argument;FILE* pipe = popen(command.c_str(), "r");if (!pipe) {std::cerr << "Error executing the shell script." << std::endl;return -1;}char buffer[128];std::string result = "";while (!feof(pipe)) {if (fgets(buffer, 128, pipe) != nullptr) {result += buffer;}}int exitCode = pclose(pipe);if (exitCode == -1) {std::cerr << "Error closing the pipe." << std::endl;return -1;}std::cout << "Shell script output: " << result;return exitCode;
}int main() {std::string scriptPath = "your_script.sh";std::string argument = "your_argument";std::future<int> result = std::async(std::launch::async, executeShellScript, scriptPath, argument);// You can perform other tasks while the script is running asynchronouslyint exitCode = result.get();std::cout << "Shell script exited with code: " << exitCode << std::endl;return 0;
}
在上面的示例中,executeShellScript 函数接受Shell脚本的路径和要传递给脚本的参数。它使用 popen 执行脚本,并在异步任务中调用它。在 main 函数中,std::async 用于启动异步任务执行外部脚本。您可以在启动异步任务后执行其他任务,然后使用 result.get() 来等待异步任务的完成并获取返回的退出码。
请替换 "your_script.sh" 和 "your_argument" 为实际的脚本路径和参数。确保您的脚本在执行时可以接受参数并处理它们。
- 2.执行linux系统命令的简单例程
 在C++中,您可以结合使用popen函数和std::async来执行Linux系统命令。下面是一个简单的例程,演示如何执行Linux系统命令并获取其输出。
#include <iostream>
#include <fstream>
#include <future>
#include <string>std::string executeLinuxCommand(const std::string& command) {FILE* pipe = popen(command.c_str(), "r");if (!pipe) {std::cerr << "Error executing the command." << std::endl;return "";}char buffer[128];std::string result = "";while (!feof(pipe)) {if (fgets(buffer, 128, pipe) != nullptr) {result += buffer;}}int status = pclose(pipe);if (status == -1) {std::cerr << "Error closing the pipe." << std::endl;return "";}return result;
}int main() {std::string command = "ls -l"; // Replace with the desired Linux commandstd::future<std::string> result = std::async(std::launch::async, executeLinuxCommand, command);// You can perform other tasks while the command is running asynchronouslystd::string commandOutput = result.get();std::cout << "Command output:\n" << commandOutput;return 0;
}
在上面的示例中,executeLinuxCommand 函数接受要执行的Linux命令,并使用 popen 执行该命令。然后,通过 std::async 在异步任务中调用它。在 main 函数中,std::async 用于启动异步任务执行Linux命令。您可以在启动异步任务后执行其他任务,然后使用 result.get() 来等待异步任务的完成并获取命令的输出。
请替换"ls -l"为您要执行的实际Linux命令。这个示例只是一个演示,您可以根据需要替换命令。确保您的Linux命令能够在Shell中正常执行。
相关文章:
 
C++笔记之popen()和std_system()和std_async()执行系统命令比较
C笔记之popen()和std_system()和std_async()执行系统命令比较 code review! 文章目录 C笔记之popen()和std_system()和std_async()执行系统命令比较1.popen()2.std::system()3.std::async()——C11提供的异步操作库,适合在多线程中执行外部命令,建议使…...
 
pycharm2020无法打开,点击无反应
pycharm 2020 无法打开,点击无反应,今天我碰到这现象,总结大体原因 C:\Users\ygw\AppData\Roaming\JetBrains (删除该目录即可,一般由于升级安装 或 安装两个不同版本 会存在老旧文件影响导致)...
 
深度学习之微调
在现代深度学习领域,精细调整(Fine-tune)已经成为一种非常重要的技术手段。 预训练模型 在介绍finetune之前,先了解一下什么是预训练模型。在搭建一个网络模型来完成一个特定的图像分类的任务时,首先,需要…...
【# 完美解决 node.js 模块化后报错 ReferenceError: require is not defined】
完美解决 node.js 模块化后报错 ReferenceError: require is not defined 错误信息如图 直接改插件源码:(不是cnpm里的插件,而是下载下来的export2Excel.js) 在export2Excel.js内只要改动头部一行源码即可 改之前:…...
Jackson忽略json数组中null元素
问题 前端传过来的json字符串中,其中json数组包含null字符。类型如下: ["0","1","2",null]这边Spring使用Jackson进行反序列化是会出现List对象中,包含null的数组元素。即List大小为4,本来List的…...
 
基于SpringBoot的网上订餐系统
基于SpringBoot的网上订餐系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色:用户、管理员管理员:登录、个人中心、会员管理、…...
【04】基础知识:React组件实例三大核心属性 - state
一、state 了解 理解 1、state 是组件对象最重要的属性,值是对象(可以包含多个 key-value 的组合) 2、组件被称为 “状态机”, 通过更新组件的 state 来更新对应的页面显示(重新渲染组件) 强烈注意 1、…...
 
SpringBoot 过滤器filter当中的自定义异常捕获问题
需求描述:需要根据用户的请求路径拦截做权限控制: 但是这样做全局异常无法捕获 解决方案: 在filter当中引入HandlerExceptionResolver类,通过该类的resolveException方法抛出自定义异常: public class OpenInvokeFil…...
 
实验3:左右循环LED灯
获取流水灯工程: 方式一: keilproteus 完成最小系统,点亮led 灯实验_吴小凹的博客-CSDN博客 方式二: Flowing_led.zip - 蓝奏云直接下载。 原理图修改: 无须修改只需要使用流水灯的工程即可,解压到桌面…...
 
行业追踪,2023-10-13
自动复盘 2023-10-13 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…...
 
【实用小工具】一键分离音频中的纯人声~
音分轨——能够一键分离出音频中的【人声】和【音乐】,并单独输出为新的音频文件。可以用来扒谱、提取人声、消除背景音等。 第一步:打开【音分轨】APP,进入首页点击【人声分离】 第二步:选择导入方式,上传需要提取伴…...
 
如何在虚幻引擎中渲染动画?
大家好,今天我将展示如何在虚幻引擎中渲染动画,以及虚幻引擎渲染动画怎么设置的方法步骤。 需要提前了解: 虚幻引擎本地运行慢、渲染慢、本地配置不够,如何解决? 渲云云渲染支持虚幻引擎离线渲染,可批量…...
Hadoop3教程(三):HDFS文件系统常用命令一览
文章目录 语法格式(44) HDFS的文件系统命令(开发重点)参考文献 语法格式 hdfs命令的完整形式: hdfs [options] subcommand [subcommand options]其中subcommand有三种形式: admin commandsclient comman…...
 
2023年中国手机回收量、手机回收价值及行业细分现状分析[图]
手机回收的主要去向包括再销售及环保降解两类。其中进行再交易的二手手机多为9成新及以上手机。二手手机最终去向主要为再销售及环保降解。 2016年以来,我国手机总体出货量持续下滑,2022年全年,国内市场手机总体出货量累计2.72亿部࿰…...
 
格式转换 ▏Python 实现Word转HTML
将Word转换为HTML能将文档内容发布在网页上,这样,用户就可以通过浏览器直接查看或阅读文档而无需安装特定的软件。Word转HTML对于在线发布信息、创建在线文档库以及构建交互式网页应用程序都非常有用。以下是用Python将Word转换为HTML网页的攻略…...
 
自己在家给电脑重装系统Win10教程
自己在家怎么给电脑重装系统Win10?Win10电脑系统如果操作时间特别长了,就可能出现卡顿、蓝屏等系统问题,这时候用户就想给电脑重装系统,却不知道重装具体的操作步骤,下面小编给大家详细介绍自己在家给电脑重装Win10系统…...
 
198、RabbitMQ 的核心概念 及 工作机制概述; Exchange 类型 及 该类型对应的路由规则;了解什么是JMS。
目录 JMS 讲解★ RabbitMQ的核心概念★ RabbitMQ工作机制★ Connection(连接) 与 Channel(通信信道)★ Exchange★ Exchange与Queue★ Exchange的类型(4种)及 该类型对应的路由规则 看RabbitMQ 之前&#x…...
 
怎样理解伦敦金交易的点差
不管大家做的是什么投资品种,只要过程中有中间商提供了一定的服务,那么就需要支付一定的费用,这也是十分合理的事情。在伦敦金的市场上,交易平台主要通过点差的形式,向客户征收一定的投资服务费用。 伦敦金买卖过程中的…...
 
mysql主从工作原理、搭建
目录 一、mysql为什么要用主从架构? 二、mysql数据库主从复制原理是什么? 详细的主从复制过程如下图: 主从复制过程概述: 三、mysql主从如何搭建? 本次安装的数据库版本为mysql5.7 1、准备两台服务器(…...
PHP实现赛邮【SUBMAIL】短信通知
接口文档地址:https://www.mysubmail.com/documents 实现短信通知实例: $url https://api-v4.mysubmail.com/sms/xsend;//接口地址 $appId XXX;//APPID $appkey XXX;//APPKEY $phone XXX;//发送手机号 $project XXX;//模板ID $data …...
 
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
 
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
 
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
 
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
 
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
 
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
 
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
 
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
 
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
