首页 > 系统相关 >c++执行shell操作

c++执行shell操作

时间:2024-11-08 15:59:33浏览次数:1  
标签:std shell buf c++ char include command 执行 fpRead

 

message("----->>>>>shelldemo/CMakeLists.txt" )

# 收集当前目录下所有的 .cpp 文件
aux_source_directory(. DIR_SRCS)

# 添加可执行文件
add_executable(shelldemo ${DIR_SRCS})

# 链接需要的库
target_link_libraries(shelldemo ${LIB_LIB})
/shelldemo/CMakeLists.txt

 

 1 #ifndef COMCFUNC_H
 2 #define COMCFUNC_H
 3 #include <iomanip>
 4 #include <iostream>
 5 #include <cstdint>  // uint64_t
 6 
 7 class ComModule {
 8 
 9 
10 public:
11     /**
12      * @brief Shell 运行脚本 内存不足时调用vpopen以保证脚本执行成功
13      * @param command 脚本命令
14      * @param opt 0 : vpopen 1:popen
15      * @return true:执行成功 false:执行失败
16      */
17     static bool Shell(const char* command, int opt = 0);
18 
19     static void Shell(const char* command, std::string &sOut);
20 
21     static void vforkShell(const char* command, std::string &sOut);
22 
23     static std::uint64_t GetTickCount();
24 };
25 
26 #endif
commodule.h
 1 #include "commodule.h"
 2 #include <sys/time.h>
 3 #include <time.h>
 4 #include <sys/mman.h>
 5 #include <fcntl.h>
 6 #include <unistd.h>
 7 #include  <cstring>  // strerror
 8 bool ComModule::Shell(const char *command, int opt)
 9 {
10     printf("start %s ",command);
11     int startTime = ComModule::GetTickCount();
12 
13     FILE *fpRead;
14     fpRead = popen(command, "r");
15     if(fpRead == nullptr) {
16         printf("err %s %d %s ", command, errno, strerror(errno));
17         return false;
18     }
19 
20     if(opt)
21     {
22         pclose(fpRead);
23     }
24 
25 
26     int endTime = ComModule::GetTickCount();
27     if(endTime - startTime > 2000)
28     {
29         printf("shell time consuming %dms, cmd: %s ", endTime - startTime, command);
30     }
31     printf("end %s ",command);
32     return true;
33 }
34 
35 void ComModule::Shell(const char* command, std::string &sOut)
36 {
37     char* result = "";
38     FILE *fpRead;
39     fpRead = popen(command, "r");
40     if(fpRead == nullptr) {
41         printf("err %s %d %s ", command, errno, strerror(errno));
42         return;
43     }
44     char buf[1024] = {0};
45     memset(buf,'\0',sizeof(buf));
46     sOut.clear();
47     while(fgets(buf,1024-1,fpRead)!=nullptr)
48     {
49         sOut.append(buf);
50     }
51 
52     pclose(fpRead);
53 }
54 
55 
56 void ComModule::vforkShell(const char* command, std::string &sOut)
57 {
58     char* result = "";
59     FILE *fpRead;
60     fpRead = popen(command, "r");
61     if(fpRead == nullptr) {
62         printf("err %s %d %s ", command, errno, strerror(errno));
63         return;
64     }
65     char buf[1024]={0};
66     memset(buf,'\0',sizeof(buf));
67     sOut.clear();
68     while(fgets(buf,1024-1,fpRead)!=nullptr)
69     {
70         sOut.append(buf);
71     }
72 
73     pclose(fpRead);
74 }
75 
76 
77 std::uint64_t ComModule::GetTickCount()
78 {
79     struct timespec ts;
80 
81     clock_gettime(CLOCK_MONOTONIC, &ts);
82 
83     return ((std::uint64_t)ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
84 }
commodule.cpp

 

cmake_minimum_required(VERSION 3.2)
project(cppdemos)

#set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -rdynamic -O0 -ggdb -std=c++11 -Wall -Wno-deprecated -Werror -Wno-unused-function -Wno-builtin-macro-redefined -Wno-deprecated-declarations ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wreturn-type -fdata-sections -ffunction-sections -fstack-protector-strong -fPIC")
## -Wno-unused-variable


include_directories(.)
include_directories(/usr/local/include)
link_directories(/usr/local/lib64)

#输出目录重定向
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

set(LIB_LIB
    pthread
    )

## 初步认识线程
add_subdirectory(shelldemo)
/CMakeLists.txt
#include <iostream>
#include "commodule.h"


void test1(){
    {
        ComModule::Shell("rm -rf  abc.log");
    }

    {
        std::string strCmd = "ls -lah ";
        std::string strOut;
        ComModule::Shell(strCmd.c_str(), strOut);   
        std::cout <<"Shell:" << strOut << std::endl;
    }

    {
        std::string strCmd = "ls -lah ";
        std::string strOut;
        ComModule::vforkShell(strCmd.c_str(), strOut);   
        std::cout <<"vforkShell:" << strOut << std::endl;
    }
}



int main(){
    test1();

    return 0;
}
shelldemo.cpp

 

标签:std,shell,buf,c++,char,include,command,执行,fpRead
From: https://www.cnblogs.com/music-liang/p/18535248

相关文章

  • 【C++篇】无序中的法则:探索 STL之unordered_map 与 unordered_set容器的哈希美学
    文章目录C++`unordered_map`和`unordered_set`容器详解前言第一章:`unordered_map`和`unordered_set`的概念1.1`unordered_map`和`unordered_set`的定义1.2与`map`、`set`的区别第二章:`unordered_map`和`unordered_set`的构造方法2.1`unordered_map`......
  • Chromium 进程降权和提权模拟示例c++
     一、背景知识概念参考微软链接:强制完整性控制-Win32应用程序|Microsoft学习授权)(模拟级别-Win32apps|MicrosoftLearnDuplicateTokenEx函数(securitybaseapi.h)-Win32apps|MicrosoftLearn本文主要演示 low,medium,high,andsystem四种权限创建......
  • C++之OpenCV入门到提高004:Mat 对象的使用
    一、介绍今天是这个系列《C++之Opencv入门到提高》得第四篇文章。这篇文章很简单,介绍如何使用Mat对象来实例化图像实例,了解它的构造函数和常用的方法,这是基础,为以后的学习做好铺垫。虽然操作很简单,但是背后有很多东西需要我们深究,才能做到知其然知其所以然。OpenCV具......
  • 实战:看懂并分析执行计划——Index Scan (NonClustered)
    根据该执行计划截图中的信息,我们可以看到SQLServer在执行该查询时使用了IndexScan(NonClustered),这通常表示数据库未能利用索引进行精确查找,因此进行了较大的扫描操作。以下是对每行信息的解释和优化建议。IndexScan(NonClustered)解释PhysicalOperation:In......
  • C++ 模板参数的两种类型转换
    与非模板函数一样,我们在一次调用中传递给函数模板的实参被用来初始化函数的形参。如果一个函数形参的类型使用了模板类型参数,那么它采用特殊的初始化规则。只有很有限的几种类型转换会自动地应用于这些实参。编译器通常不是对实参进行类型转换,而是生成一个新的模板实例。与往常一......
  • C++ 模板显式实例化
    //template.hpptemplate<typenameT>classDylan{public:Dylan(Tt);Tm_data;};//template.cpp#include"template.hpp"template<typenameT>Dylan<T>::Dylan(Tt){m_data=t;}templateclassDylan<int&g......
  • C++关于DLL导出模板类和模板函数
    这两天写了个Dll,要导出普通类中的模板函数,稍微查了一下,没查到具体资料。自己根据C++模板的编译原理,推断出应该要源码放在头文件中直接导出,查了下接触的OpenSource项目,确实如此。这里记录一下,方便下次查阅。1、宏定义说明:#ifdefDLL_PROJECT#defineTEMPLATE_IM_EXPORT__decl......
  • 为什么找不到vcruntime140_1.dll,无法继续执行代码的原因及五种有效解决方法
    vcruntime140_1.dll是微软VisualC++RedistributableforVisualStudio的一个动态链接库(DLL)文件。它是运行由VisualStudio2015及更高版本编译的C++应用程序所必需的。该DLL文件包含了支持C++标准库和Microsoft特定扩展功能的运行时函数,对于Windows应用程序......
  • win10找不到vcruntime140_1.dll,无法继续执行代码的解决方法
    vcruntime140_1.dll是微软VisualC++RedistributableforVisualStudio的一个动态链接库(DLL)文件。它是运行由VisualStudio2015及更高版本编译的C++应用程序所必需的。该DLL文件包含了支持C++标准库和Microsoft特定扩展功能的运行时函数,对于Windows应用程序......
  • c++多态学习:多态含义与使用
    目录 多态的概念多态的定义多态的实现注意事项 多态的概念多态是面向对象编程中的一个重要概念,它指的是同一个行为具有多个不同表现形式或形态的能力。在C++中,多态主要通过虚函数来实现,允许将子类类型的指针赋值给父类类型的指针,并在运行时根据实际对象类型调用相......