我在Linux上运行的C中编写了一个小型自定义Web服务器应用程序。当应用程序收到请求时,它会调用fork()并在一个单独的进程中处理该请求,该进程被chroot到包含我想要提供的文件的特定目录中。
我想将应用程序移植到Windows,但是在这个平台上既没有fork()也没有chroot(),并且似乎没有任何直接的等价物。你能指点我在Windows中提供这个功能的简单(并且写得最好)的代码示例吗?我的C并不是那么好,所以越简单越好。
答案 0 :(得分:9)
首先,等同于chroot
的Windows为RUNAS
,即documented here。如果您需要从程序中执行此操作,那么学习this C++ source code应该可以帮助您了解如何使用Windows API。它与chroot()
并不完全相同,但Windows民众通过创建具有极其有限权限的用户并仅授予该用户对应用程序文件夹的读取权限以及对一个文件夹的写入权限来使用它来创建类似chroot jail的内容对于数据。
您可能不希望在Windows上完全模仿fork()
,因为它听起来并不像您需要走得那么远。要了解用于创建流程的Windows API及其与fork()
的区别,请检查Mr. Peabody Explains fork()。 Cygwin's fork implementation的实际当前源代码显示了当前的最新状态。
CreateProcess()
和CreateThread()
的Microsoft文档可以查找有关它们之间差异的更多信息。
最后,如果你不想学习所有细节,只需编写适用于Windows和Unix的可移植程序,为什么不使用Apache Portable Runtime library本身。在C中Here are some docs on process creation with some sample code创建一个新流程。
答案 1 :(得分:3)
Windows上没有fork()
这样的东西。你需要调用CreateProcess()
- 这将启动一个单独的进程(大多等同于调用fork()
然后立即exec()
生成进程)并以某种方式将参数传递给它。由于您似乎要在专用目录中处理所有数据,因此您可以使用lpCurrentDirectory
的{{1}}参数 - 只需将先前使用的目录路径传递给CreateProcess()
。
答案 2 :(得分:2)
最简单的方法是使用Cygwin,这是Windows的免费Unix模拟层。下载并安装完整的开发环境。 (在安装程序中选择。)如果幸运的话,您将能够按原样编译程序,完全没有任何更改。
当然有缺点,有些人可能会认为这是“作弊”,但你要求最简单的解决方案。
答案 3 :(得分:1)
不使用兼容性框架(Interix,Cygwin,...),您正在考虑使用Windows范例来做这类事情。
fork / vfork在UNIX上是一个廉价的操作,这就是为什么它经常与多线程相比使用。 Windows等价物 - CreateProcess()
- 相比之下是一项昂贵的操作,因此您应该查看使用线程,并使用CreateThread()
创建它们。 CreateThread()
有很多示例代码。
就chroot()
而言,Windows没有这个概念。那里的图书馆声称可以模仿你需要的东西。然而,这取决于你为什么要首先chroot。
阅读评论,如果仅仅是为了阻止人们使用../../../../
(等)上升树,chroot会完成这项工作,但是它首先解析输入并确保它是理智的: ,如果指定了太多父项,则将用户锁定到已知的根目录中。 Apache几乎可以肯定这样做,因为我从来没有必要为Apache创建一个chroot()环境......
答案 4 :(得分:0)
使用fork / chroot根本不是Windows上的事情。如果您担心子进程的安全性,可能需要使用某种形式的虚拟化或沙盒。将复杂信息传递给子流程可以通过某种形式的RPC解决方案来完成。
听起来好像你是用Unix设计你的应用程序,现在你想在Windows上运行而不必改变任何东西。在这种情况下,您可能需要考虑使用 Cygwin ,但我不确定Cygwin是否/如何模仿chroot
。
答案 5 :(得分:0)
考虑SUA(又名Windows Services for Unix)。它几乎包含了移植应用程序所需的一切。