fork / chroot等效于Windows服务器应用程序

我用Linux在C上编写了一个小型自定义Web服务器应用程序。 当应用程序接收到一个请求时,它调用fork()并在一个单独的进程中处理这个请求,这个进程被chrooted到一个包含我想提供的文件的特定目录中。

我想将应用程序移植到Windows,但是在这个平台上fork()和chroot()都不可用,并且似乎没有任何直接的等价物。 你能指点我一个简单的(最好是写得好的)代码的例子,它将在Windows中提供这个function吗? 我的C并不是那么好,所以越简单越好。

首先, chroot的Windows等价物是RUNAS , 这里记录了这个 。 如果您需要从程序中执行此操作,那么学习此C ++源代码应该可以帮助您了解如何使用Windows API。 它和chroot()完全不一样,但是Windows用户通过创建一个权限非常有限的用户来创建类似于chroot jail的东西,只给这个用户在应用程序文件夹上的读取权限,并且为一个文件夹写入数据权限。

你可能不想在Windows上完全模拟fork() ,因为它听起来不像你需要走得那么远。 要了解用于创建流程的Windows API以及它与fork()不同之处,请检查Mr. Peabody解释fork() 。 Cygwin的fork实现的实际当前源代码显示了当前最新的技术状态。

CreateProcess()CreateThread()的Microsoft文档是查找它们之间差异的更多信息的地方。

最后,如果您不想学习所有基本的平台细节,只需编写可在Windows和Unix上运行的可移植程序,那么为什么不直接使用Apache Portable Runtime库呢 ? 这里有一些关于创建流程的文档 ,用C语言中的一些示例代码来创建一个新流程。

在Windows上没有fork()这样的东西。 你需要调用CreateProcess() – 这将启动一个单独的进程(大致相当于调用fork() ,然后立即exec()生成的进程),并以某种方式传递参数。 由于您似乎拥有要在专用目录中处理的所有数据,因此您可以使用CreateProcess()lpCurrentDirectory参数 – 只需将您以前在chroot()使用的目录路径传递给此目录即可。

最简单的方法就是使用Windows的免费Unix仿真层Cygwin 。 下载并安装完整的开发环境。 (在安装程序中选择。)如果幸运的话,您将能够按原样编译您的程序,根本不需要更改。

当然也有不足之处,有些人可能会认为这是“作弊”,但你要求最简单的解决方案。

没有使用兼容性框架(Interix,Cygwin,…),你正在使用Windows范例来处理这类事情。

fork / vfork在UNIX上是一个廉价的操作,这就是与多线程相比经常使用的原因。 相当于Windows的CreateProcess() – 是比较昂贵的操作,因此,您应该看看使用线程,而不是使用CreateThread()创建它们。 CreateThread()有很多示例代码。

chroot() ,Windows没有这个概念。 那里的图书馆声称模仿你需要的东西。 然而,这取决于你为什么要chroot在第一位。

读取注释,如果仅仅是阻止人们用../../../../ )去树,chroot会做这个工作,但是它并不能替代解析输入,并且确保这是理智的:即,如果指定的父母太多,则将用户锁定到已知的根目录中。 Apache几乎肯定会这样做,因为我从来不需要为Apache创建一个chroot()环境来工作。

使用fork / chroot根本不是在Windows上完成的事情。 如果您担心子流程中的安全问题,可能需要使用某种形式的虚拟化或沙盒。 将复杂信息传递给子进程可以通过某种形式的RPC解决方案来完成。

这听起来就像你用Unix的方式设计你的应用程序,现在你想在Windows上运行,而不必改变任何东西。 在这种情况下,你可能要考虑使用Cygwin ,但我不确定Cygwin是否/如何模拟chroot

考虑SUA(也称为Unix的Windows服务)。 它几乎拥有移植应用程序所需的一切。

男人chroot(interix)