Windows API 在结构和风格上与任何 Unix 风格提供的系统调用和库例程的混合非常不同。
termio.h
Windows 的终端 I/O 模型与任何 *nix 系统都非常不同。因此,实际上没有直接等效的termios.h
header 和它的朋友。
您想在 MSDN 上阅读有关 Windows 的信息通讯资源.
需要了解更多信息的一些内容包括:
- The DCB结构
- The 通讯超时结构
- BuildCommDCB()
- SetCommState()
- ... 还有很多 ...
一般来说,您会发现您需要直接处理更多的 Windows API,因为stdio
会在进行设备 I/O 时增加混乱。
select.h
没有与 Unix select(2) 系统调用直接等效的方法。
在 Windows 中,许多内核对象可以处于有信号状态或无信号状态,并且向对象发出信号的行为可用于释放调用WaitForMultipleObjects()。一些但不是全部HANDLE
当数据可用时,对象会收到信号。具体来说,我知道HANDLE
WinSock 的 s 有这个功能,但我不知道 Comm API。我知道HANDLE
s 到一个打开的文件则不然。
如果您需要等待正在处理窗口消息的线程中的事件,那么您可能应该使用MsgWaitForMultipleObjects()相反,因为它会在线程被阻塞时正确传递消息。
在 MSDN 文章中阅读有关 Windows 同步原语的信息使用同步.
然而,Windows 中内置了多种异步 I/O,可以替代对异步 I/O 的需要。select()
通过改变设计。两者都需要大量使用无法与 C stdio 库结合使用的功能。
MSDN 有几篇关于 I/O 技术的文章以及大量示例:
-
输入/输出概念
- 同步和异步 I/O
-
同步和重叠输入和输出
-
CreateFile()(特别是备注部分)
请注意,有关 Windows 如何工作的大部分信息都分散在 API 函数和结构参考材料的概述文章和备注部分中。这可能会给人这样的印象:第一次阅读时没有任何内容被完整记录。
使用 Cygwin 进行移植
另一种方法是使用Cygwin做港口。它在 Windows API 上提供了大部分 POSIX 层。但是,您最终会得到一个依赖于 Cygwin DLL(GPL)的应用程序,除非您从他们那里购买商业使用许可证。使用 Cygwin 获得一个对于没有 Unix 经验的 Windows 用户也能正常工作的应用程序可能很棘手,因为关于这两个系统的设置和使用方式的许多其他假设都不同。
Cygwin 已经做了相当多的繁重工作来构建select()
它在 Windows 上运行,给定不同的打开文件描述符的混合。这个努力是用户指南中描述.
请注意,只有在 Cygwin 环境中完成时,针对 Cygwin 的构建才会被记录和支持。仅将 Cygwin 的 bin 放在 Windows PATH 上并从命令提示符运行通常是不够的。您确实需要启动 Cygwin 的 bash 构建并从那里进行编译,以便所有内容都使用相同的 Cygwin 风格的安装点和模拟的 Unix 文件结构。
将 Cygwin 头文件与第三方工具头文件混合肯定会导致疯狂。
Edit:我重新安排了一些,并添加了一些材料来回应评论。