0

0

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

冰火之心

冰火之心

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

|

296人浏览过

|

来源于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(),声明在 <unistd.h></unistd.h> 中,返回 pid_t 类型整数。

  • 无需链接额外库,g++clang++ 默认支持
  • pid_t 通常是 int,但应避免硬编码int,直接用 pid_t 或转成 long 打印更安全
  • 该函数永不失败,无错误码,也不需要检查返回值
#include <iostream>
#include <unistd.h>

int main() {
    pid_t pid = getpid();
    std::cout << "PID: " << pid << std::endl;
    return 0;
}

Windows 下用 GetCurrentProcessId()

Windows 不提供 getpid(),需包含 <windows.h></windows.h> 并调用 GetCurrentProcessId(),返回 DWORD(即 unsigned long)。

  • 不能直接包含 <unistd.h></unistd.h>,否则编译报错:‘getpid’ was not declared in this scope
  • 若写跨平台代码,需用预处理器判断:#ifdef _WIN32 分支调用 GetCurrentProcessId()
  • 该函数也永不失败,无错误处理开销
#include <iostream>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#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)。二者完全无关:

人民网AIGC-X
人民网AIGC-X

国内科研机构联合推出的AI生成内容检测工具

下载

立即学习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 混在一起用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

76

2023.06.20

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

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

306

2023.11.28

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

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

210

2023.12.04

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

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

322

2024.02.23

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

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

292

2025.06.11

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

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

178

2025.08.07

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

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

490

2025.06.09

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

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

202

2025.07.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

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

精品课程

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

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

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

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