如何以独立于平台的方式派生,等待和终止进程?

时间:2019-02-10 21:43:14

标签: c cmake multiplatform waitpid process-management

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

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

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

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

1 个答案:

答案 0 :(得分:2)

Windows

在普通Windows上,fork()(创建新进程)和exec()(在此进程中运行新程序)并不存在。相反,您有CreateProcess结合了两者。

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

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

POSIX

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

另请参阅:capability of `posix_spawn`

跨平台库

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

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