前言
linux程序中执行shell命令的方式有很多种,譬如:system、exec族函数、popen。这里演示使用popen来执行ping命令,并获取执行结果。
popen函数
popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。
参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。此外,所有使用文件指针(FILE*)操作的函数也都可以使用,除了fclose()以外。
如果 type 为 “r”,那么调用进程读进 command 的标准输出。
如果 type 为 “w”,那么调用进程写到 command 的标准输入。
代码
#include <memory>
#include <string>
#include <cstdio>
bool executeShellCommand(const std::string& shellCmd)
{
std::unique_ptr<char[]> buff(new char[2048]);
FILE* fp = popen(shellCmd.c_str(), "r");
if (nullptr == fp) {
return false;
}
auto size = fread(buff.get(), 1, 2048, fp);
if (0 != size) {
printf("%s\n", buff.get());
}
auto executeStatus = pclose(fp);
if (executeStatus < 0) {
return false;
}
if (0 != WEXITSTATUS(executeStatus)) {
return false;
}
return true;
}
测试
executeShellCommand("ping -c 1 -W 1 www.baidu.com");
参考
https://blog.csdn.net/kuniqiw/article/details/124297888