【问题标题】:Start and kill processes in C++ cross platform在 C++ 跨平台中启动和终止进程
【发布时间】:2016-08-14 12:25:00
【问题描述】:

我正在寻找一种在 C++ 中以跨平台方式对进程进行基本管理的方法,但我不能使用外部库(如 boost::process)。 场景是这样的 - 我正在使用 std::system 调用子进程, 现在,如果父进程被信号中断,我需要在退出之前杀死子进程,以避免将其作为僵尸。 我已经阅读了信号处理,但我不确定如何在句柄函数中终止使用 std::system 创建的进程。 还有其他/更好的方法吗?

【问题讨论】:

  • 如果父母死了,孩子会变成孤儿,而不是僵尸。僵尸是没有收割的死去的孩子。
  • 解决方案取决于系统。根据您的描述,您似乎使用的是 unix(例如 linux、BSD 等)或类似设备。是POSIX吗?如果是这样,您将拥有一组与平台相关的功能,可用于查找/杀死进程(尽管 posix 的某些方面被松散地指定,因此实现因系统而异)。如果您有多种目标系统(例如 posix 和非 posix),您肯定需要针对不同目标的不同解决方案。除了使用第三方库之外,标准 C++ 中没有其他解决方案(这些库又负责处理平台依赖关系)

标签: c++


【解决方案1】:

C++ 最近有了线程语义,但它还没有(还没有?)进程语义。因此,它不提供任何工具来终止系统上运行的进程。

因此,唯一可行的方法是让父进程向子进程发送某种信号,并让子进程在收到信号后自行终止。有多种方法可以执行此信号(例如,通过 OS 信号、通过标准 IPC 原语、通过网络),但标准 C++ 并没有为其中的大多数提供任何可移植机制。因此,您最终会选择使用外部库(例如,Boost、Qt 等)或将您的实现限制在一组受支持的系统(例如,POSIX 操作系统,在这种情况下,您甚至可以直接调用 @987654321 @)。

【讨论】:

    【解决方案2】:

    流程管理特定于每个平台。经典的方式(如果你不想使用外部库)是为每个平台编写代码并用编译时预处理器条件将其分开:

    // For both OS X and iOS
    #ifdef __APPLE__
       // includes or code
    #endif
    
    // For Windows:
    #ifdef __MINGW32__
       // includes or code
    #endif    
    
    // For Linux:
    #ifdef __linux__
      // includes or code
    #endif
    

    这里有更多解决方案: How to identify platform/compiler from preprocessor macros?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 2017-07-25
      • 1970-01-01
      • 2017-11-26
      相关资源
      最近更新 更多