我用 C 语言编写了一个在 Linux 上运行的小型自定义 Web 服务器应用程序。当应用程序接收到请求时,它调用 fork() 并在单独的进程中处理请求,该进程被 chroot 到包含我想要提供的文件的特定目录中。
我想将应用程序移植到 Windows,但在这个平台上既没有 fork() 也没有 chroot(),而且似乎没有任何直接的等价物。您能否指出一个简单(最好写得很好)的代码示例,该示例将在 Windows 中提供此功能?我的 C 不是那么好,所以越简单越好。
首先,这里记录的 Windows等价物chroot
is 。如果您需要从程序中执行此操作,那么研究此 C++ 源代码应该可以帮助您了解如何使用 Windows API。它与Windows 用户使用它来创建类似 chroot 监狱的东西并不完全相同,方法是创建一个权限极其有限的用户,并且只授予该用户对应用程序文件夹的读取权限,以及对一个文件夹的数据写入权限。RUNAS
chroot()
您可能不想fork()
在 Windows 上完全模拟,因为听起来您不需要走那么远。要了解用于创建进程的 Windows API 以及它与 的区别fork()
,请查看Peabody 先生解释 fork()。Cygwin 的 fork 实现的实际当前源代码向您展示了当前最先进的技术。
Microsoft 文档CreateProcess()
和CreateThread()
是查找有关它们之间差异的更多信息的地方。
最后,如果您不想了解所有平台细节,只需编写可在 Windows 和 Unix 上运行的可移植程序,为什么不直接使用Apache Portable Runtime 库本身。以下是一些关于进程创建的文档,其中包含一些示例代码,用 C 语言创建一个新进程。
fork()
在 Windows上没有这样的东西。您需要调用CreateProcess()
- 这将启动一个单独的进程(主要相当于调用fork()
然后立即exec()
为生成的进程)并以某种方式将参数传递给它。由于您似乎在专用目录中处理了所有数据,因此您可以使用lpCurrentDirectory
参数 of CreateProcess()
- 只需传递您之前在chroot()
那里使用的目录路径。
最简单的方法是使用Cygwin,它是 Windows 的免费 Unix 仿真层。下载并安装完整的开发环境。(在安装程序中选择。)如果幸运的话,您将能够按原样编译您的程序,根本不需要更改。
当然也有缺点,有些人可能会认为这是“作弊”,但您要求最简单的解决方案。
在不使用兼容性框架(Interix、Cygwin、...)的情况下,您正在考虑使用 Windows 范例来处理这类事情。
fork/vfork 在 UNIX 上是一种廉价的操作,这就是与多线程相比经常使用它的原因。Windows 等价物 -CreateProcess()
相比之下是一项昂贵的操作,因此您应该考虑使用线程,用CreateThread()
. 有很多示例代码CreateThread()
。
在 方面chroot()
,Windows 没有这个概念。那里有图书馆声称可以模仿您需要的东西。但是,这取决于您首先要 chroot 的原因。
Reading comments, if it's simply to stop people going up the tree with ../../../../
(etc), chroot would do the job, but it's no substitue for parsing input in the first place and making sure it's sane: i.e., if too many parents are specified, lock the user into a known root directory. Apache almost certainly does this as I've never had to create a chroot() environment for Apache to work...
使用 fork/chroot 根本不是在 Windows 上完成的事情。如果您担心子流程中的安全性,那么您可能想要使用某种形式的虚拟化或沙盒。将复杂信息传递给子进程可以通过某种形式的 RPC 解决方案来完成。
在我看来,您好像已经以 Unix 方式设计了您的应用程序,而现在您想在 Windows 上运行而无需进行任何更改。在这种情况下,您可能需要考虑使用Cygwin,但我不确定 Cygwin 是否/如何模拟chroot
。
考虑 SUA(又名 Windows Unix 服务)。它几乎拥有移植应用程序所需的一切。