我想将该应用程序移植到Windows平台,但是在该平台上既没有fork()方法也没有chroot()方法,并且似乎也没有直接的等价物。你能指导我提供这个功能在Windows下的简单(最好是书写良好)示例代码吗?我的C语言不是很好,所以越简单越好。
chroot
等效的是RUNAS
,相关文档在这里。如果你需要从程序中执行此操作,则可以研究这个C++源代码,以了解如何使用Windows API。虽然它不完全相同于chroot()
,但Windows用户使用它创建类似于chroot jail的东西,通过创建一个具有极限权限的用户,并仅为该用户提供应用程序文件夹的读取权限和一个数据文件夹的写入权限。fork()
,因为这听起来并不需要那么远。要了解创建进程的Windows API及其与fork()
的区别,请查看Mr. Peabody解释fork()。而Cygwin的fork实现则展示了当前技术的最新状态。CreateProcess()
和CreateThread()
,Microsoft的文档是查找更多信息的地方。chroot()
,chroot
改变的是你的根目录,而不是你所识别的用户。 - Hasturkunfork()
函数。你需要调用CreateProcess()
函数,这将启动一个独立的进程(大多等同于调用fork()
然后立即为生成的进程调用exec()
),并以某种方式传递参数。由于你似乎已经有了要处理的所有数据所在的专用目录,因此你可以利用CreateProcess()
的lpCurrentDirectory
参数——只需将之前用chroot()
设置的目录路径传递给它即可。lpCurrentDirectory
对应的是 chdir() 而不是 chroot()。 - Baffe Boyois最简单的方法是使用Windows下的免费Unix仿真层Cygwin。下载并安装完整的开发环境(在安装程序中选择)。如果你很幸运,你可以直接编译你的程序而不需要做任何修改。
当然,这种方法也有缺点,有些人可能会认为这是“作弊”,但你要求的是最简单的解决方案。
如果不使用兼容性框架(Interix、Cygwin等),则需要使用Windows范例来完成这种操作。
在UNIX系统中,fork/vfork是一种廉价的操作,因此与多线程相比,它经常被使用。而Windows中的等效操作CreateProcess()则相对昂贵,因此您应该考虑使用线程,使用CreateThread()创建线程。有很多示例代码可以使用CreateThread()。
关于chroot(),Windows没有这个概念。有一些库声称可以模拟您所需的功能。但是这取决于您为什么要使用chroot。
根据评论,如果只是为了防止人们使用../../../../(等)向上跳转,则chroot可以完成任务,但它不能替代首先解析输入并确保其合理:即,如果指定了太多的父级目录,则将用户锁定到已知的根目录。Apache几乎肯定会执行此操作,因为我从未必须为Apache创建chroot()环境...
在Windows上,使用fork/chroot根本不是做事情的方式。如果您关心子进程中的安全性,可能需要使用某种形式的虚拟化或沙盒技术。通过某种形式的RPC解决方案可以传递复杂信息到子进程。
听起来好像您已经按照Unix的方式设计了应用程序,现在想在Windows上运行而不必更改任何内容。在这种情况下,您可能需要考虑使用Cygwin,但我不确定Cygwin如何模拟chroot
。