0

0

c++中如何获取当前运行程序的pid_c++获取进程标识符的方法【详解】

冰火之心

冰火之心

发布时间:2026-01-22 13:26:02

|

156人浏览过

|

来源于php中文网

原创

C++中获取当前进程PID需按平台调用系统API:Linux/macOS用getpid()(),Windows用GetCurrentProcessId()();二者均无错误返回,但类型不同且不可跨平台混用,线程ID(std::this_thread::get_id)不等价于PID。

c++中如何获取当前运行程序的pid_c++获取进程标识符的方法【详解】

在 C++ 中获取当前进程的 PID,本质是调用操作系统提供的接口,C++ 标准库本身不提供跨平台的 getpid 函数,但所有主流平台都支持对应的系统 API,且行为一致。

Linux / macOS 下直接使用 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;
}

Windows 下用 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)。二者完全无关:

MCP Market
MCP Market

MCP Servers集合平台,帮你找到最好的MCP服务器

下载

立即学习C++免费学习笔记(深入)”;

  • 一个进程可有多个线程,每个线程 ID 均不同,且格式不保证是数字(可能是指针或结构体)
  • 主线程的 thread ID ≠ 进程 PID;在 Linux 上甚至完全不共享内核标识符
  • 试图将 std::thread::id 强转为整数并当作 PID 使用,会导致逻辑错误或崩溃

常见误用与陷阱

实际工程中容易踩坑的地方集中在跨平台和类型处理上:

  • 在 Windows 上误写 getpid() —— 编译失败,必须用 GetCurrentProcessId()
  • pid_t 当作 int 直接 printf("%d") —— 在某些旧系统上 pid_tshort,导致截断;建议用 %ld + (long)pidstd::to_string()
  • 在 fork 后未注意子进程 PID 已变 —— getpid() 返回的是调用时刻所在进程的 PID,fork 后父子进程各自调用才得到各自 PID
  • 混淆 getppid()(父进程 PID)和 getpid() —— 尤其在守护进程或双 fork 场景下,容易误判“谁是 parent”

真正要注意的不是“怎么写一行代码”,而是确保类型匹配、平台适配、以及理解 PID 是内核级标识——它只在本机唯一,重启后重置,跨机器无意义。别把它和线程 ID、句柄、或随机生成的 ID 混在一起用。

相关专题

更多
printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

73

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

282

2023.11.28

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

282

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

255

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

121

2025.08.07

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

197

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

190

2025.07.04

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

9

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.6万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号