当前位置:首页 C++ > 正文

C++获取当前所有进程的完整路径

作者:野牛程序员:2023-07-18 08:37:45 C++阅读 2841

在C++中,可以使用操作系统的API来获取当前所有进程的完整路径。以下是在Windows和Linux上分别使用不同的API来实现这一目标的示例代码:

在Windows上:

#include <windows.h>
#include <iostream>
#include <vector>

int main() {
    // 获取当前所有进程的快照
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE) {
        std::cerr << "Failed to create process snapshot." << std::endl;
        return 1;
    }

    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);

    // 获取第一个进程的信息
    if (!Process32First(hProcessSnap, &pe32)) {
        std::cerr << "Failed to get process information." << std::endl;
        CloseHandle(hProcessSnap);
        return 1;
    }

    std::vector<std::wstring> processPaths;

    // 遍历所有进程并获取其完整路径
    do {
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID);
        if (hProcess != NULL) {
            wchar_t path[MAX_PATH];
            DWORD pathSize = MAX_PATH;

            // 获取进程的完整路径
            if (QueryFullProcessImageName(hProcess, 0, path, &pathSize)) {
                processPaths.push_back(path);
            }

            CloseHandle(hProcess);
        }
    } while (Process32Next(hProcessSnap, &pe32));

    CloseHandle(hProcessSnap);

    // 输出所有进程的完整路径
    for (const auto& path : processPaths) {
        std::wcout << path << std::endl;
    }

    return 0;
}

在Linux上:

#include <dirent.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>

std::string GetProcessPath(int pid) {
    std::string path = "/proc/" + std::to_string(pid) + "/exe";
    char buffer[PATH_MAX];
    ssize_t len = readlink(path.c_str(), buffer, sizeof(buffer) - 1);
    if (len != -1) {
        buffer[len] = '\\0';
        return std::string(buffer);
    }
    return std::string();
}

int main() {
    DIR* procDir = opendir("/proc");
    if (procDir == nullptr) {
        std::cerr << "Failed to open /proc directory." << std::endl;
        return 1;
    }

    std::vector<std::string> processPaths;

    dirent* entry;
    while ((entry = readdir(procDir)) != nullptr) {
        std::string name = entry->d_name;
        if (name != "." && name != "..") {
            int pid;
            std::istringstream(name) >> pid;
            if (pid != 0) {
                std::string path = GetProcessPath(pid);
                if (!path.empty()) {
                    processPaths.push_back(path);
                }
            }
        }
    }

    closedir(procDir);

    // 输出所有进程的完整路径
    for (const auto& path : processPaths) {
        std::cout << path << std::endl;
    }

    return 0;
}

这些示例代码可以获取当前所有进程的完整路径并将其输出到控制台。请注意,在Windows上,需要链接kernel32.libpsapi.lib库,而在Linux上,需要使用-lprocps链接选项。

这些代码仅提供了获取进程路径的基本示例。可以根据自己的需求进行修改和扩展。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击