是否可以编写libPOSIX for Windows(Win32)而无需后台服务或始终加载的DLL?

rub*_*nvb 6 unix windows posix

我知道Cygwin,我知道它的缺点.我也知道它的缓慢fork,但不是为什么在地球上不可能解决这个问题.我也知道Cygwin需要一个DLL.我也理解POSIX定义了一个完整的环境(shell等等),这不是我真正关心的.

我的问题是询问是否有另一种方法来解决这个问题.我看到MinGW项目正在实现越来越多的POSIX功能,但是没有完整的解决方案提供完整的(与Linux/Mac/BSD实现状态相当)POSIX功能.

问题实际上归结为:Win32 API(从MSVC20开始)能否有效地用于通过Windows API提供完整的POSIX层?

也许这将成为一个完整的libc,它只能访问操作系统库中的文件系统访问,线程和进程控制等低级内容.但我不确切知道POSIX究竟包含了什么.我怀疑一个库可以将Win32变成符合POSIX标准的实体.

Ric*_*ner 5

POSIX <> Win32.

如果您正在尝试编写面向POSIX的应用程序,为什么不使用*N*X的某些变体?如果您更喜欢运行Windows,则可以在PC /笔记本电脑等上运行Linux/BSD/Hyper-V/VMWare/Parallels/VirtualBox内的任何内容.

Windows曾经有一个与Win32子系统一起运行的POSIX兼容环境,但由于缺乏需求而在NT4之后停止运行.微软收购了Interix并发布了Unix服务(SFU).虽然它仍可供下载,但SFU 3.5现已弃用,不再开发或支持.

至于为什么fork这么慢,你需要理解fork不仅仅是"创建一个新进程",而是"创建一个新进程(本身是一个昂贵的操作),它与调用进程和所有内存重复" .

在*N*X中,分叉进程映射到与父进程相同的内存页面(即非常快),并且只有在分叉进程尝试修改任何共享页面时才会给出新页面.这称为写入时的副本.这在很大程度上是可以实现的,因为在UNIX中,父进程和分叉进程之间没有硬性障碍.

另一方面,在NT中,所有进程都由CPU硬件强制执行的屏障隔开.在NT中,生成可以访问进程内存和资源的并行活动的最简单方法是创建一个线程.线程在创建过程的内存空间内运行,并且可以访问所有进程的内存和资源.

还可以通过各种形式的IPC,RPC,命名管道,邮件槽,内存映射文件在进程之间共享数据,但每种技术都有其自身的复杂性,性能特征等.请阅读此内容以获取更多详细信息.

因为它试图模仿UNIX,所以CygWin的'fork'操作会创建一个新的子进程(在它自己的独立内存空间中),并且必须复制新分叉子进程内父进程中的每一页内存.这可能是一项非常昂贵的操作.

同样,如果要编写POSIX代码,请在*N*X中执行,而不是NT.