linux/macos下用getpid()获取进程id,需包含,返回pid_t类型;windows下用getcurrentprocessid(),需包含,返回dword类型;二者均不会失败,且不可用std::this_thread::get_id()替代;跨平台应封装为统一返回long类型的内联函数。

Linux/macOS下用 getpid() 获取进程ID
在 POSIX 系统(包括 Linux 和 macOS)上,getpid() 是标准且唯一推荐的方式。它来自 <unistd.h></unistd.h>,返回类型是 pid_t,本质是带符号整数,但实际值总是非负。
常见错误是误用 fork() 的返回值或混淆 getppid()(父进程 ID)。getpid() 不会失败,无需检查返回值。
- 必须包含头文件:
#include <unistd.h></unistd.h> - 直接调用:
pid_t pid = getpid(); - 打印时建议用
%d(pid_t在多数系统上等价于int),但更稳妥写法是%ld+ 强转:printf("PID: %ld\n", (long)pid);
Windows 下用 GetCurrentProcessId()
Windows 不提供 getpid(),而是用 WinAPI 函数 GetCurrentProcessId(),声明在 <windows.h></windows.h> 中,返回类型为 DWORD(即 unsigned long)。
注意:该函数不会失败,也不需要 HANDLE 参数——和名字里 “Current” 对应,它只作用于当前进程,不涉及句柄操作。
- 包含头文件:
#include <windows.h></windows.h> - 调用方式:
DWORD pid = GetCurrentProcessId(); - 打印时用
%lu,例如:printf("PID: %lu\n", pid); - 不要和
GetCurrentProcess()混淆——后者返回的是伪句柄(HANDLE),不是 PID
C++11 起可用 std::this_thread::get_id()?不,那是线程 ID
有人尝试用 std::this_thread::get_id() 或 std::thread::id 来“取进程 ID”,这是典型误解。线程 ID 和进程 ID 完全无关,且 std::thread::id 是不可移植的实现定义类型,无法转成数字 PID。
即使在单线程程序中,std::this_thread::get_id() 也绝不等于 getpid() 的结果。两者数值、语义、生命周期都不同。
-
std::this_thread::get_id()→ 线程标识,仅用于线程间区分,无系统级意义 -
getpid()/GetCurrentProcessId()→ 内核分配的唯一进程标识,可用于信号发送、调试器 attach、/proc 查看等 - 跨平台封装时,绝不能用线程 ID 替代进程 ID
跨平台封装要注意宏判断和类型统一
如果代码需同时跑在 Windows 和 POSIX 上,别硬写 if/else 分支混用裸函数,容易漏掉头文件或类型不一致。最简健壮做法是封装一个内联函数,并统一返回 long 或 int64_t。
例如:
#ifdef _WIN32
#include <windows.h>
inline long get_current_pid() { return static_cast<long>(GetCurrentProcessId()); }
#else
#include <unistd.h>
inline long get_current_pid() { return static_cast<long>(getpid()); }
#endif</long></unistd.h></long></windows.h>
注意点:
- 不要用
#ifdef __linux__—— macOS 也走 POSIX 路径,应优先用_WIN32判断 Windows - 避免直接返回
pid_t或DWORD,跨平台接口类型必须明确且可打印 - 某些嵌入式或特殊环境(如 Cygwin、MSYS2)可能行为略有差异,但上述封装在主流场景已足够稳定
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











