获取标准shell 命令的输出内容

cmdline.h

#include <iostream> #include <mutex>

class Cmdline {

private:

Cmdline() = default;

public:

~Cmdline() = default;

Cmdline(const Cmdline& cmd) = delete;

Cmdline& operator=(const Cmdline& cmd) = delete;

public:

static Cmdline& getInstance();

void executeCMD(const std::string& cmd, std::string& result);

private:

static std::mutex m_mutex;

};

cmdline.cpp

#include "cmdline.h"

#include "stdio.h"

std::mutex Cmdline::m_mutex;

Cmdline& Cmdline::getInstance()

{

std::lock_guard<std::mutex> lck(m_mutex);

static Cmdline instance;

return instance;

}

void Cmdline::executeCMD(const std::string& cmd, std::string& result)

{

char buf_ps[1024] = {0};

std::string temp_cmd = cmd + " 2>&1"; //标准错误重定向到标准输出

FILE* ptr = nullptr;

if((ptr = popen(temp_cmd.c_str(), "r")) != nullptr)

{

while(fgets(buf_ps, 1024, ptr) != nullptr)

{

result += buf_ps;

}

pclose(ptr);

ptr = nullptr;

}

else

{

std::cout << "popen %s error!!" << std::endl;

}

}

test.cpp

#include "cmdline.h"

int main(int argc, char* argv[])

{

if(argc != 2)

{

std::cout << "error number args" << std::endl;

return -1;

}

std::string strResult = "";

std::string cmd = argv[1];

Cmdline::getInstance().executeCMD(cmd, strResult);

std::cout << "result: " << strResult << std::endl;

return 0;

}

上一篇:反射获取类中的属性和set属性


下一篇:请注意,再次记住, centos7,fedora 24中 没有iptables服务, 而使用的firewalld, 也可以安装 iptables-services程序来实现