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 …...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
