5

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

我想将应用程序移植到 Windows,但在这个平台上既没有 fork() 也没有 chroot(),而且似乎没有任何直接的等价物。您能否指出一个简单(最好写得很好)的代码示例,该示例将在 Windows 中提供此功能?我的 C 不是那么好,所以越简单越好。

4

6 回答 6

9

首先,这里记录的 Windows等价chrootis 。如果您需要从程序中执行此操作,那么研究此 C++ 源代码应该可以帮助您了解如何使用 Windows API。它与Windows 用户使用它来创建类似 chroot 监狱的东西并不完全相同,方法是创建一个权限极其有限的用户,并且只授予该用户对应用程序文件夹的读取权限,以及对一个文件夹的数据写入权限。RUNASchroot()

您可能不想fork()在 Windows 上完全模拟,因为听起来您不需要走那么远。要了解用于创建进程的 Windows API 以及它与 的区别fork(),请查看Peabody 先生解释 fork()Cygwin 的 fork 实现的实际当前源代码向您展示了当前最先进的技术。

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

最后,如果您不想了解所有平台细节,只需编写可在 Windows 和 Unix 上运行的可移植程序,为什么不直接使用Apache Portable Runtime 库本身。以下是一些关于进程创建的文档,其中包含一些示例代码,用 C 语言创建一个新进程。

于 2009-11-10T16:14:44.070 回答
3

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

于 2009-11-06T10:06:05.937 回答
2

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

当然也有缺点,有些人可能会认为这是“作弊”,但您要求最简单的解决方案。

于 2009-11-10T09:39:19.797 回答
1

在不使用兼容性框架(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...

于 2009-11-12T16:32:47.197 回答
0

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

在我看来,您好像已经以 Unix 方式设计了您的应用程序,而现在您想在 Windows 上运行而无需进行任何更改。在这种情况下,您可能需要考虑使用Cygwin,但我不确定 Cygwin 是否/如何模拟chroot

于 2009-11-10T09:24:55.007 回答
0

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

人 chroot(interix)

于 2009-11-11T18:50:23.400 回答