C++中获取当前进程PID需按平台调用系统API:Linux/macOS用getpid()(),Windows用GetCurrentProcessId()();二者均无错误返回,但类型不同且不可跨平台混用,线程ID(std::this_thread::get_id)不等价于PID。
在 C++ 中获取当前进程的 PID,本质是调用操作系统提供的接口,C++ 标准库本身不提供跨平台的 getpid 函数,但所有主流平台都支持对应的系

getpid()
POSIX 系统(包括 Linux 和 macOS)定义了 getpid(),声明在 中,返回 pid_t 类型整数。
g++ 或 clang++ 默认支持pid_t 通常是 int,但应避免硬编码为 int,直接用 pid_t 或转成 long 打印更安全#include#include int main() { pid_t pid = getpid(); std::cout << "PID: " << pid << std::endl; return 0; }
GetCurrentProcessId()
Windows 不提供 getpid(),需包含 并调用 GetCurrentProcessId(),返回 DWORD(即 unsigned long)。
,否则编译报错:‘getpid’ was not declared in this scope#ifdef _WIN32 分支调用 GetCurrentProcessId()
#include#ifdef _WIN32 #include #else #include #endif int main() { #ifdef _WIN32 DWORD pid = GetCurrentProcessId(); #else pid_t pid = getpid(); #endif std::cout << "PID: " << pid << std::endl; return 0; }
std::this_thread::get_id() 替代?std::this_thread::get_id() 返回的是线程 ID(thread ID),不是进程 ID(PID)。二者完全无关:
std::thread::id 强转为整数并当作 PID 使用,会导致逻辑错误或崩溃实际工程中容易踩坑的地方集中在跨平台和类型处理上:
getpid() —— 编译失败,必须用 GetCurrentProcessId()
pid_t 当作 int 直接 printf("%d") —— 在某些旧系统上 pid_t 是 short,导致截断;建议用 %ld + (long)pid 或 std::to_string()
getpid() 返回的是调用时刻所在进程的 PID,fork 后父子进程各自调用才得到各自 PIDgetppid()(父进程 PID)和 getpid() —— 尤其在守护进程或双 fork 场景下,容易误判“谁是 parent”真正要注意的不是“怎么写一行代码”,而是确保类型匹配、平台适配、以及理解 PID 是内核级标识——它只在本机唯一,重启后重置,跨机器无意义。别把它和线程 ID、句柄、或随机生成的 ID 混在一起用。