C/C++ 运行shell脚本,并获取返回结果

您所在的位置:网站首页 shell调用c C/C++ 运行shell脚本,并获取返回结果

C/C++ 运行shell脚本,并获取返回结果

2024-07-13 05:42:22| 来源: 网络整理| 查看: 265

C/C++运行shell命令通常有两种办法,调用 system() 或者 popen() 函数

1. system函数

system() 函数原型:

/* Execute the given line as a shell command. This function is a cancellation point and therefore not marked with __THROW. */ extern int system (const char *__command) __wur;

可以发现, system() 函数会运行shell命令,并返回标志位,告知用户命令是否运行成功,但是不会返回shell指令的运行结果。

有时,我们需要shell命令的运行结果,比如我们写系统监控日志,我们需要把结果写到文件里 popen函数可以帮助我们。

2. popen函数

popen()函数原型:

/* Create a new stream connected to a pipe running the given command. This function is a possible cancellation point and therefore not marked with __THROW. */ extern FILE *popen (const char *__command, const char *__modes)

popen函数的功能是这样的:创建一个子shell进程,运行__command指令;同时,会建立一个匿名管道用户当前进程和子进程之间的通信,用户可以通过这个管道,获取shell命令的运行结果,或是向shell进行写输入参数,popen函数的返回值FILE*就是指向这个管道。这个管道是一个单向管道,只能写或者读,不能同时读写,因此__modes只能是“r”或者“w”。

参考这篇文章(修改了几个小bug),封装了一个运行shell命令的函数;

纯C版:

#include #include #define CMD_RESULT_BUF_SIZE 1024 int ExecuteCMD_C(const char* cmd, char* result_) { char result[CMD_RESULT_BUF_SIZE] = {0}; char buf_temp[CMD_RESULT_BUF_SIZE] = {0}; FILE *ptr = NULL; int iRet = -1; //popen: 开启子进程,建立管道,并运行指令,'r':从子进程获取结果,'w':向子进程写数据 if((ptr = popen(cmd, "r")) != NULL) //popen { while(fgets(buf_temp, sizeof(buf_temp), ptr) != NULL) { if(strlen(result) + strlen(buf_temp) > CMD_RESULT_BUF_SIZE){ printf("shell返回结果超出buffer size,进行截断\n"); break; } strcat(result, buf_temp); //字符串拼接 } strcpy(result_, result); pclose(ptr); ptr = NULL; iRet = 0; // 处理成功 } else { printf("popen %s error\n", cmd); iRet = -1; // 处理失败 } return iRet; } int main() { char result_[CMD_RESULT_BUF_SIZE] ; ExecuteCMD_C("ps -e|grep test2| grep -v 'grep' | awk '{print $1}'", result_); printf("%s",result_); ExecuteCMD_C("ls", result_); printf("%s",result_); }

在这里插入图片描述. .

C++ std::string版:

#include #include #include #include #define CMD_RESULT_BUF_SIZE 1024 int ExecuteCMD_Cpp(const std::string cmd, std::string &result_) { result_ = {}; char buf_temp[CMD_RESULT_BUF_SIZE] = {0}; FILE *ptr = NULL; int iRet = -1; //popen: 开启子进程,建立管道,并运行指令,'r':从子进程获取结果,'w':向子进程写数据 if((ptr = popen(cmd.c_str(), "r")) != NULL) //popen { while(fgets(buf_temp, sizeof(buf_temp), ptr) != NULL) { result_ += buf_temp; } pclose(ptr); ptr = NULL; iRet = 0; // 处理成功 } else { printf("popen %s error\n", cmd.c_str()); iRet = -1; // 处理失败 } return iRet; } int main() { std::string str; ExecuteCMD_Cpp("ps -e|grep test2| grep -v 'grep' | awk '{print $1}'", str); std::cout


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭