什么是Windows等同于sys/select.h和termios.h中定义的功能

Ren*_*h G 20 c linux winapi

我在linux中有一个应用程序,它已成功编译.我想在Windows中运行相同的程序.

但编译会产生以下与头文件相关的错误.

  1. 找不到sys/select.h
  2. 找不到termios.h

我怎样才能解决这个问题?

RBe*_*eig 33

Windows API在结构和风格上与任何Unix风格的系统调用和库例程的混合非常不同.

termio.h中

Windows使用与任何*nix系统完全不同的模型进行终端I/O. 结果,真的没有直接相当于termios.h标题及其朋友.

您想在MSDN上阅读有关Windows 通信资源的信息.

要了解更多信息,请参阅:

通常,您会发现需要直接使用Windows API处理更多内容,因为stdio在执行设备I/O时会增加混乱.

select.h

没有直接等同于Unix select(2)系统调用.

在Windows中,许多内核对象可以处于信号状态或非信号状态,并且发信号通知对象的行为可用于释放调用的线程WaitForMultipleObjects().HANDLE当数据可用时,会发出一些但不是所有对象的信号.具体来说,我知道HANDLE来自WinSock的s具有该功能,但我不了解Comm API.我知道HANDLE打开文件不会.

如果您需要等待处理窗口消息的线程中的事件,那么您应该使用MsgWaitForMultipleObjects()它,因为它将在线程被阻止时正确传递消息.

阅读MSDN文章" 使用同步"中的Windows同步原语.

但是,Windows中内置了几种异步I/O,可以select()通过更改设计来取代需要.两者都需要广泛使用不能与C stdio库结合使用的功能.

MSDN有几篇关于I/O技术的文章,以及大量的例子:

请注意,有关Windows如何工作的大部分信息都分散在概述文章和API函数和结构的参考资料的备注部分中.这可以给人的印象是,在第一次阅读时没有任何内容完整记录.

与Cygwin一起移植

另一种方法是使用Cygwin来做端口.它通过Windows API提供大多数POSIX层.但是,除非您从他们那里购买商业使用许可,否则您最终会得到一个依赖于Gg的Cygwin DLL的应用程序.使用Cygwin获得一个适用于没有Unix经验的Windows用户的应用程序可能会很棘手,因为关于这两个系统的设置和使用方式的许多其他假设不同.

select()鉴于混合使用不同的打开文件描述符,Cygwin已经做了相当多的繁重工作来构建一个适用于Windows 的实现."用户指南"中介绍了此项工作.

请注意,如果在Cygwin环境中完成,则仅记录和支持针对Cygwin的构建.将Cygwin的bin放在Windows PATH上并从命令提示符下工作通常是不够的.你真的需要启动Cygwin的bash构建并从那里编译,以便所有东西都使用相同的Cygwin样式挂载点和模拟的Unix文件结构.

将Cygwin头文件与第三方工具头文件混合是疯狂的可靠途径.

编辑:我重新安排了一下,并添加了一些材料以回应评论.

  • 需要指出的是,Windows下有一个select(2)调用;但是它只能与网络套接字一起使用,不能与 stdio 等一起使用。 (2认同)