从 UNIX 到 Win32 的迁移

将应用程序从 UNIX 迁移到 Windows 时,有几种选择:

  • 使用 UNIX 库将应用程序从 UNIX 移植到 Win32

  • 以本机方式将应用程序从 UNIX 移植到 Win32

  • 使用 POSIX 子系统在 Windows 上运行 UNIX 应用程序

UNIX 库

UNIX 程序员通常考虑的一种选择是用第三方的类似于 UNIX 的库,使他们的 UNIX 代码可以编译成 Win32 可执行文件。有几个商用库(和至少一个公用域)提供这样的功能。这是某些应用程序采用的一种方式。这些移植库的优点是将初始的移植工作减到最少。对于想在竞争中取胜的软件产品来说,主要的缺点是应用程序的本机 Win32 移植一般较快并且必然将具有更多的功能。应用程序在需要发出 Win32 调用以从 Windows 中获得更多功能时,很难移出它的 UNIX shell。

下表为移植和支持 UNIX 移植到 Visual C++ 提供 Microsoft 和第三方资源:

UNIX 移植指南

“UNIX 自定义应用程序移植指南”提供有关从 UNIX 到 Win32 环境的代码移植的技术帮助。

https://go.microsoft.com/fwlink/?linkid=95428

“Unix 移植项目指南”通过提供从 UNIX 到 Win32 迁移大量项目的高级帮助对“UNIX 自定义应用程序移植指南”进行补充。该指南提供对项目移植的每一阶段要考虑的问题的建议。可以从下面的地址下载该指南:

https://go.microsoft.com/fwlink/?linkid=20012

Microsoft Windows Services for UNIX (SFU)

Microsoft Windows Services for UNIX (SFU) 为将 Windows 集成到现有的基于 UNIX 的环境提供全面的跨平台服务。面向 UNIX 的服务提供文件共享、远程访问和管理、密码同步、公共目录管理、一组通用实用工具和一个 shell。

Windows Services for UNIX

InteropSystems.com

http://www.interopsystems.com/

提供将 UNIX 移植到 Win32 的软件支持的第三方公司的站点。

C++ Boost 网站

http://boost.sourceforge.net/regression-logs/

http://boost.sourceforge.net/boost-build2/

直接将 UNIX 应用程序移植到 Win32

另一种选择是直接将 UNIX 应用程序移植到 Win32。使用 ANSI C/C++ 库和商用 C 编译库,UNIX 应用程序依赖的许多传统系统调用可以在 Win32 应用程序中使用。

基于 stdio 的应用程序的输出模型不必改动,因为 Win32 控制台 API 模仿 stdio 模型,且存在使用 Win32 控制台 API 的 curses 版本。有关更多信息,请参见 SetConsoleCursorPosition

基于 Berkeley 套接字的应用程序只需做很少的改动就可以作为 Win32 应用程序运行。Windows 套接字当初设计时考虑了与 BSD 套接字的可移植性,只需按 WinSock 规范中介绍性部分的说明做最小的改动。

Windows 支持符合 DCE 的 RPC,因此基于 RPC 的应用程序易于使用。请参见 RPC 函数

差别最大的一个方面是进程模型。UNIX 有 fork,而 Win32 则没有。根据 fork 和基本代码的使用情况,Win32 有两个可以使用的 API:CreateProcessCreateThread。分支出自身的多个副本的 UNIX 应用程序可以在 Win32 中修正,或者使用多进程,或者使用包含多个线程的单进程。如果使用多进程,则有多种 IPC 方法可用来在各个进程之间通信(如果需要 fork 提供的功能,或许还可以用来将新进程的代码和数据更新为同父级一样)。有关 IPC 的更多信息,请参见进程间通信

Windows 和 UNIX 的图形化模型差别很大。UNIX 使用 X Window 系统 GUI,而 Windows 使用 GDI。虽然在概念上相似,但 X API 与 GDI API 之间不存在简单的映射关系。不过,OpenGL 支持可用于移植基于 OpenGL 的 UNIX 应用程序。并且有用于 Windows 的 X 客户端和 X 服务器。有关 GDI 的信息,请参见设备上下文

基本的 UNIX 应用程序(包括许多 CGI 应用程序)应该可以轻松地移植到运行于 Windows 上的 Visual C++。类似 openfopenreadwrite 的函数及其他函数在 Visual C++ 运行库中也可用。另外,在 C UNIX API 和 Win32 API 之间还存在一对一映射:open 对应 CreateFileread 对应 ReadFilewrite 对应 WriteFileioctl 对应 DeviceIOControlclose 对应 CloseFile,等等。

Windows POSIX 子系统

UNIX 程序员可以考虑的另一个选择是 Windows POSIX 子系统。但是,它只支持 POSIX 1003.1,这是在创建 Windows NT 时标准化的唯一 POSIX 版本。从那时起,很少要求扩展该子系统,因为大多数应用程序都已转换成了 Win32。1003.1 系统对于全功能应用程序的作用有限,因为它不包含许多功能(如 1003.2 中的功能、网络支持等等)。在 Windows POSIX 子系统下运行的全功能应用程序不能访问 Win32 应用程序可以使用的 Windows 功能,如内存映射文件、联网和图形。VI、LS 和 GREP 这样的应用程序是 Windows POSIX 子系统的主要目标。

请参见

参考

UNIX

概念

推理规则

其他资源

迁移和升级程序