std::pair<bool, string> exeShellCmds(const string &cmd, std::vector<string> &results)
{
#ifdef _linux_
int bufferSize = 1024;
char *buffer = new char[bufferSize];
FILE *pFile = nullptr;
std::string cmds = cmd;
cmds.append(" && echo $?");//获取上一条命令执行结果
if (nullptr == (pFile = popen(cmds.c_str(), "r")))
{
return std::move(std::make_pair(false, "execute shell command error"));
}
while (nullptr != fgets(buffer, bufferSize, pFile))
{
buffer[strlen(buffer) - 1] = '\0'; //fgets() 会自动在末尾加入换行符,linux 下换行符就是 \n(LF),这里把自动添加的换行符去掉
results.emplace_back(buffer);
}
delete[] buffer;
pclose(pFile);
if (results.size() > 0 && results[results.size() - 1] != "0") {
//执行失败
std::string errmsg = "";
auto cnt = results.size() - 1;
for (int i = 0; i < cnt; i++) {
errmsg.append(results[i]).append(";");
}
return std::move(std::make_pair(false, std::move(errmsg)));
}
else
#endif
return std::move(std::make_pair(true, ""));
}
//通过shell命令根据进程名字获取进程id
int find_pid_by_name(const char* ProcName, int* foundpid)
{
std::string cmdstr = "";
#ifdef _linux_
//ps aux | grep "procname" | egrep -v grep | cut -c 9-15
const char* cmdstr_first = "ps aux | grep \"";
const char* cmdstr_end = "\" | egrep -v grep | awk '{print $2}'";
cmdstr.append(cmdstr_first).append(ProcName).append(cmdstr_end);
#endif
std::vector<string> retvets;
auto ret = exeShellCmds(cmdstr, retvets);
if (ret.first) {
//成功
if (retvets.size() == 2) {
return atoi(retvets[0].c_str());
}
}
return 0;
}