Linux 將進程信息暴露在虛擬文件系統 /proc 中。每個進程對應目錄 /proc/,其中 cmdline 文件存儲完整命令行參數,參數間以 \0 分隔。
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
int main(int argc, char *argv[]) {
if (argc != 2) {
std::cerr << "用法: " << argv[0] << " \n";
return EXIT_FAILURE;
}
std::string path = "/proc/" + std::string(argv[1]) + "/cmdline";
std::ifstream fin(path);
if (!fin) {
std::cerr << "無法打開 " << path << '\n';
return EXIT_FAILURE;
}
std::string token;
// 以 '\0' 為分隔符逐個讀取參數
while (std::getline(fin, token, '\0')) {
if (!token.empty())
std::cout << token << '\n';
}
return EXIT_SUCCESS;
}
std::getline(fin, token, '\0'):利用第三個參數指定分隔符為空字符,完美匹配 cmdline 格式。/proc/self/exe:char buf[PATH_MAX]; readlink("/proc/self/exe", buf, sizeof(buf));此方法僅限 Linux。Windows 需用 GetModuleFileNameEx,macOS/BSD 用 proc_pidpath 或 _NSGetExecutablePath。跨平台庫(如 Boost.Process、libuv)已封裝好差異。