【问题标题】:How to fork, wait on and kill processes in a platform-independent way?如何以独立于平台的方式分叉、等待和终止进程?
【发布时间】:2019-02-10 21:43:13
【问题描述】:

我有一些 C 代码使用 fork()+exec()wait()(或 waitpid())和 kill() - 并假设它们在包含相关 POSIX 标头后存在。

现在,我想让这段代码尽可能多平台化 - 改动最少。因此,没有引入第三方库依赖项,也没有在没有它们的系统上实现这些设施。然而,对我来说,超越 Linux、Windows 和 Mac OS 是很重要的。我这样做的工具是 CMake,带有此代码的项目使用它;和 C 预处理器。可能是 C 语言中的一点点胶水代码。

我的问题:我应该检查什么,我应该在生成的包含文件中添加什么,以及我应该如何修改调用这些函数的代码以在 POSIX 和各种非 POSIX 平台上实现相同的行为?

PS - 我意识到许多平台没有 Unix 风格的信号。让我们假设为了讨论,我只是终止进程,而不是发送其他信号。

【问题讨论】:

  • “没有引入第三方库依赖,也没有重新发明轮子”——在我看来,这是两个直接冲突的要求。
  • @JonathonReinhart:编辑澄清我的意思。
  • 好吧,除了显而易见的 #ifdef HAVE_FORK 解决方案之外,我不确定您在寻找什么。
  • 如果您需要fork(),那么超越 Linux、Windows 和 Mac 会领先一点,因为您首先必须绕过 Windows没有fork()
  • @JonathonReinhart:哦,好吧,就是这样,除了我想要一个“如果你有 fork+exec,就用那个;如果你有 spawn,就用那个;如果你有其他类似的东西,但是具有不同的参数顺序,使用“等”等。

标签: c cmake multiplatform waitpid process-management


【解决方案1】:

窗口

好吧fork()(创建一个新进程)和exec()(在这个进程中运行一个新程序)在Windows上不存在,简单明了。相反,你有CreateProcess,它结合了两者。

然后您可以使用TerminateProcess 来终止进程。

然后您可以实现两个单独的 .c 文件:一个用于 Windows,另一个用于具有 fork()/exec() 的系统。

POSIX

如果您只关心跨 POSIX 环境(Linux、BSD、Mac OS)的可移植性,那么posix_spawn() 绝对是您的最佳选择。它处理子进程中所有错综复杂的错误处理。

另请参阅:capability of `posix_spawn`

跨平台库

有许多跨平台框架可以为您解决这个问题:

它们当然也解决了许多其他可移植性问题,因此最好真正“购买”并使用该框架来完成与系统交互的所有操作。

【讨论】:

  • 这已经对我有所帮助,尽管不是我所追求的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
相关资源
最近更新 更多