C、C++调用函数查看编译器执行的路径
调用方法:
std::string result;
SystemCommand("pwd", result, true);//这个是刚才说的那个函数
cout <<"result:" << result.c_str() << std::endl;
函数如下:
int32_t SystemCommand(const std::string& command, std::string& result, bool isShowCmd)
{
if (command.size() == 0)
{
//command is empty
return -1;
}
if (!isShowCmd)
{
#ifdef _WIN32
result.clear();
SECURITY_ATTRIBUTES sa;
HANDLE hRead, hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa, 0))
{
return -1;
}
STARTUPINFOA si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfoA(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcessA(NULL, (char*)command.c_str(), NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
{
return -1;
}
CloseHandle(hWrite);
char buffer[4096] = { 0 };
DWORD bytesRead;
while (true)
{
memset(buffer, 0, strlen(buffer));
if (ReadFile(hRead, buffer, 4095, &bytesRead, NULL) == NULL)
{
break;
}
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
result += buffer;
Sleep(10);
}
return 0;
#endif
}
char buffer[4096] = {};
std::string fresult;
#ifdef _WIN32
FILE* pin = _popen(command.c_str(), "r");
#elif __unix__
FILE* pin = popen(command.c_str(), "r");
#endif
if (!pin)
{
//popen failed
return -1;
}
result.clear();
while (!feof(pin))
{
if (fgets(buffer, sizeof(buffer), pin) != nullptr)
{
fresult += buffer;
}
}
result = fresult;
//-1:pclose failed; else shell ret
#ifdef _WIN32
return _pclose(pin);
#elif __unix__
return pclose(pin);
#endif
}