【问题标题】:How to obtain the process id portably in C++?如何在 C++ 中可移植地获取进程 ID?
【发布时间】:2018-10-09 17:52:52
【问题描述】:

在标准 C++ 中,我们可以获得当前执行线程的 id:std::this_thread::get_id()。但在撰写本文时,该语言并没有固有的过程概念。不过,我仍然想要我的进程 ID。

那么 - 在现代 C++ 中获取正在运行的进程 ID 的最便携、标准友好(尽管不是语言标准)的方法是什么?

注意事项:

  • 我意识到有些机器没有进程,但它们也不一定有线程......所以没有理由不存在具有退化情况后备的跨平台函数。
  • 至少对于 POSIX 兼容的操作系统和 Windows,我需要一个实际的进程 ID。

【问题讨论】:

  • 标准 C++ 没有进程 ID(或进程,就此而言)的概念。任何获取它的方法都必须是特定于操作系统的。想象一下你以某种方式设法获得了它——你会用它做什么(在可移植的 C++ 程序中)?练习的最终目标是什么?
  • “标准友好”是否意味着 “今天boost,可能在未来某个时间std
  • 你打算用它做什么?
  • @Galik:一些进程间通信。
  • 一台机器很可能有线程但没有进程(想想单任务控制器)。

标签: c++ pid portability


【解决方案1】:

Boost.Interprocess 拥有boost::interprocess::ipcdetail::get_current_process_id

ACE library 提供各种与操作系统相关的功能,并已移植到许多平台。有关列表,请参阅here。该库的 ACE_OS 命名空间提供了一个 getpid 实现。

一般来说,没有通用的方法可以在每个平台上获取进程 ID,因为操作系统进程管理的这方面超出了 C++ 语言的范围。

【讨论】:

  • ACE 是否为大多数/所有 POSIX 提供了一种 C++ 外观?
【解决方案2】:

那么,在(现代)C++ 中获取正在运行的进程 ID 的最可移植、最符合标准的方法是什么?

正如 Igor 的评论所说,没有标准的 C++ 方式,所以最可移植、标准友好的方式是 getpid

您不会发现任何其他标准定义的东西都可以在更广泛的平台上使用。

【讨论】:

  • 1.我没有说标准...请参阅问题编辑以强调这一点。 2. getpid() 是否可以在 Windows 上运行?我很确定那里有一些不同的巫术。
  • 我知道你问了什么,你说的是“最便携、符合标准”。但这并不意味着“可移植到每个操作系统”,甚至“可移植到 Windows”。 POSIX 具有广泛的可移植性,并且是一种标准。如果您真的是指“可移植到 Windows 和 POSIX,也许还有其他东西”,那么您应该这么说。
  • @einpoklum • 为了实现标准友好和可移植,您需要在您的C++ 代码和操作系统作为API 提供的任何内容之间建立一个“防火墙”API。将您的 C++ 代码写入边缘防火墙。根据需要在每个平台上实施边缘防火墙。
  • @Eljay:确实。我只是希望这样一堵墙(不需要火的比喻)已经普遍使用。
  • @einpoklum • 看起来有一些现成的边缘墙可用。但是,如果它们都不适合您的目的,那么创建它们并不是很难。是的,进行抽象有点麻烦,但并不难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 2015-04-13
  • 2013-02-28
  • 1970-01-01
  • 2015-09-27
  • 2011-04-22
相关资源
最近更新 更多