C++执⾏Linuxshell命令并获取命令返回值或命令执⾏结果这⾥只做展⽰作⽤,可能更新不及时,获取源码请移步gitee个⼈仓库:
1. 环境
Linux(Ubuntu)
C++11
gcc 7.5.0
g++ 7.5.0
2. 代码
Shell.h
/*
*Environment:
*Linux(Ubuntu), C++11,gcc 7.5.0,g++ 7.5.0
*Description:
*执⾏ Linux shell 命令并获取命令返回值或命令执⾏结果
*/
#ifndef PARAMETER_FLOW
#define PARAMETER_FLOW
#define IN
#define OUT
#define INOUT
#endif//PARAMETER_FLOW
#ifndef BASE_TYPE_DEF
#define BASE_TYPE_DEF
#include <stdint.h>
typedef int16_t          SHORT;
typedef uint16_t        USHORT;
typedef int32_t          INT;
typedef uint32_t        UINT;
typedef int64_t          DLONG;
typedef uint64_t        DULONG;
typedef void            VOID;
typedef bool            BOOL;
typedef char            CHAR;
typedef unsigned char    UCHAR;
typedef float            FLOAT;
typedef double          DOUBLE;
#endif//BASE_TYPE_DEF
#include <string>
#include <string.h>
#include <utility>
#include <vector>
using std::make_pair;
using std::pair;
using std::string;
using std::vector;
class Shell
{
public:
/*
*Function    : exeShellCmd
*Description : 执⾏ Linux shell 命令并获取命令返回值
*Modify      : 2020.09.17
*Input      : IN const string& cmd = "",Linux shell 命令
*            : OUT INT* cmdReturnValue = nullptr,命令返回值
*Return      : pair<BOOL, string>,<;函数是否执⾏成功,执⾏失败时的错误信息>
*Caution    :
*/
static pair<BOOL, string> exeShellCmd(IN const string& cmd = "", OUT INT* cmdReturnValue = nullptr);
/*
*Function    : exeShellCmd
*Description : 执⾏ Linux shell 命令并获取命令执⾏结果
*Modify      : 2020.09.17
*Input      : IN const string& cmd,Linux shell 命令
*            : OUT vector<string>& results,命令执⾏结果
*Return      : pair<BOOL, string>,<;函数是否执⾏成功,执⾏失败时的错误信息>
*Caution    :
*/
static pair<BOOL, string> exeShellCmd(IN const string& cmd, OUT vector<string>& results);
};    //Shell
Shell.cpp
#include "Shell.h"
pair<BOOL, string> Shell::exeShellCmd(IN const string &cmd, OUT INT *cmdReturnValue)
{
pid_t status;                //pid_t 就是 int
status = system(cmd.c_str()); //阶段1:创建⼦进程等准备⼯作,如果失败返回 -1
if (-1 == status)
{
linux循环执行命令脚本
return make_pair(false, "阶段1:创建⼦进程等准备⼯作错误, 错误信息:" + string(strerror(errno)));
}
else
{
//阶段2:调⽤ /bin/sh 拉起脚本执⾏,如果脚本拉起失败或脚本未正常执⾏结束,则原因值被写⼊到 status 的低 8~15 ⽐特位中。        //不管脚本中返回什么值,是 0 还是⾮ 0,都算正常执⾏结束。即使脚本不存在或没有执⾏权限,也都算正常执⾏结束。
//如果脚本执⾏过程中被强制 kill 掉等情况则算异常结束。
if (WIFEXITED(status))
{
if (nullptr != cmdReturnValue)
{
*cmdReturnValue = WEXITSTATUS(status); //获取脚本返回值,⼀般脚本或命令正确执⾏返回值是 0,
执⾏错误返回其它值            }
return make_pair(true, "");
}
else
{
return make_pair(false, "阶段2:调⽤ /bin/sh 拉起脚本(命令)执⾏,脚本(命令)拉起失败或脚本(命令)未正常执⾏结束");
}
}
} //exeShellCmd()
pair<BOOL, string> Shell::exeShellCmd(IN const string &cmd, OUT vector<string> &results)
{
INT bufferSize = 10240; //10KB应该是⾮常充⾜了
CHAR *buffer = new CHAR[bufferSize];
FILE *pFile = NULL;
if (NULL == (pFile = popen(cmd.c_str(), "r")))
{
return make_pair(false, "execute shell command error");
}
while (NULL != fgets(buffer, bufferSize, pFile))
{
buffer[strlen(buffer) - 1] = '\0'; //fgets() 会⾃动在末尾加⼊换⾏符,linux 下换⾏符就是 \n(LF),这⾥把⾃动添加的换⾏符去掉
}
delete[] buffer;
pclose(pFile);
return make_pair(true, "");
} //exeShellCmd()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。