要实现这个功能,你可以使用 Windows API 提供的相关函数来获取进程的信息。以下是一个可能的解决方案:#include <Windows.h>#include <iostream>#include <string>int main(int argc, char* argv[]){ if (argc != 2) { std::cout << "Usage: monitor [executable]" << std::endl; return 1; } std::string executable = argv[1]; // 创建进程 STARTUPINFOA startupInfo; PROCESS_INFORMATION processInfo; ZeroMemory(&startupInfo, sizeof(startupInfo)); ZeroMemory(&processInfo, sizeof(processInfo)); if (!CreateProcessA(NULL, const_cast<char*>(executable.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo)) { std::cout << "Failed to start the process." << std::endl; return 1; } // 等待进程结束 WaitForSingleObject(processInfo.hProcess, INFINITE); // 获取进程退出代码 DWORD exitCode; GetExitCodeProcess(processInfo.hProcess, &exitCode); // 获取进程使用时间 FILETIME creationTime, exitTime, kernelTime, userTime; GetProcessTimes(processInfo.hProcess, &creationTime, &exitTime, &kernelTime, &userTime); ULARGE_INTEGER startTime, endTime; startTime.LowPart = creationTime.dwLowDateTime; startTime.HighPart = creationTime.dwHighDateTime; endTime.LowPart = exitTime.dwLowDateTime; endTime.HighPart = exitTime.dwHighDateTime; double elapsedTime = (endTime.QuadPart - startTime.QuadPart) / 10000.0; // 获取进程内存信息 PROCESS_MEMORY_COUNTERS_EX memoryCounters; GetProcessMemoryInfo(processInfo.hProcess, (PROCESS_MEMORY_COUNTERS*)&memoryCounters, sizeof(memoryCounters)); SIZE_T memoryUsage = memoryCounters.WorkingSetSize; // 输出结果 std::cout << "time: " << elapsedTime << " ms" << std::endl; std::cout << "memory: " << memoryUsage / 1024 << "KB" << std::endl; std::cout << "return code: " << exitCode << std::endl; // 清理资源 CloseHandle(processInfo.hProcess); CloseHandle(processInfo.hThread); return 0;}
这个程序使用了 Windows API 的一些函数,包括 CreateProcessA、WaitForSingleObject、GetExitCodeProcess、GetProcessTimes 和 GetProcessMemoryInfo。它通过调用 CreateProcessA 来启动指定的可执行文件,并等待进程结束。然后,它使用其他函数来获取进程的退出代码、使用时间和内存占用信息,并将结果输出到控制台。
你可以将上述代码保存为名为 monitor.cpp 的源文件,并使用 C++ 编译器进行编译。然后,在命令行中使用 monitor 命令来运行你的程序并监视另一个可执行文件的运行状态。
希望这个解决方案对你有所帮助,如有其他问题,请随时提问。 |