在C++跨平台中启动和终止进程

4
我正在寻找一种在 C++ 中以跨平台方式对进程进行基本管理的方法,但我不能使用外部库(例如 boost::process)。 情况是这样的——我正在使用 std::system 调用子进程,现在如果父进程被信号中断,我需要在退出之前终止子进程,以避免将其留作僵尸进程。 我已经阅读了有关信号处理的内容,但我不确定如何在处理函数中终止使用 std::system 创建的进程。 是否有另一种/更好的方法来实现这一点?

如果父母死亡,孩子会成为孤儿,而不是僵尸。僵尸是指未被收割的死亡孩子。 - Kerrek SB
解决方案取决于系统。根据您的描述,您似乎在使用类Unix(例如Linux、BSD等)操作系统。它是否符合POSIX标准?如果是,您可以使用一组与平台相关的函数来查找/终止进程(尽管POSIX的某些方面规范不太明确,因此在不同的系统中实现会有所不同)。如果您有多个目标系统(例如POSIX和非POSIX),则需要为不同的目标使用不同的解决方案。除了使用第三方库(这些库处理平台依赖性)之外,标准C++中没有其他解决方案。 - Peter
2个回答

1

C++最近已经有了线程的语义,但它(还)没有进程的语义。因此,它不提供任何杀死正在系统上运行的进程的功能。

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


1

进程管理对于每个平台都是特定的。经典的方法(如果您不想使用外部库)是为每个平台编写代码,并使用编译时预处理器条件进行分离:

// 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

以下是更多的解决方案: 如何通过预处理宏识别平台/编译器?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接