我有一些C代码,它们使用fork()
+ exec()
,wait()
(或waitpid()
)和kill()
-并假定它们在包含相关内容之后存在POSIX标头。
现在,我想使此代码尽可能多平台化-更改最少。因此,没有引入第三方库依赖关系,也没有在没有它们的系统上实现这些功能。但是,对我来说重要的是超越Linux,Windows和Mac OS。我这样做的工具是CMake,带有此代码的项目使用CMake。和C预处理器。也许在C语言中只有一点点胶水代码。
我的问题:我应该检查什么,应该在生成的包含文件中放入什么,以及如何修改调用这些函数的代码以在POSIX和各种非POSIX平台上实现相同的行为?
PS-我意识到许多平台都没有Unix风格的信号。为了便于讨论,我们假设我只是终止进程,而不发送其他信号。
答案 0 :(得分:2)
在普通Windows上,fork()
(创建新进程)和exec()
(在此进程中运行新程序)并不存在。相反,您有CreateProcess
结合了两者。
然后,您可以使用TerminateProcess
终止进程。
然后,您可以实现两个单独的.c
文件:一个用于Windows,一个用于具有fork()
/ exec()
的系统。
如果您只关心跨POSIX环境(Linux,BSD,Mac OS)的可移植性,那么posix_spawn()
绝对是可行的方法。它可以处理子进程中所有复杂的错误处理。
另请参阅:capability of `posix_spawn`
有许多跨平台框架可以为您解决此问题:
他们当然也解决了许多其他可移植性问题,因此最好真正“买进”并使用该框架进行与系统交互的所有操作。