什么是Windows相当于sys / select.h和termios.h中定义的function

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

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

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

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

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

termio.h中

Windows使用与任何* nix系统非常不同的模型进行终端I / O。 结果,实际上和termios.h头文件和它的朋友没有直接的关系。

你想阅读MSDN关于Windows 通信资源 。

有些事情要进一步了解包括:

  • DCB结构
  • COMMTIMEOUTS结构
  • BuildCommDCB()
  • SetCommState()
  • … 还有很多 …

一般来说,你会发现你需要直接处理更多的Windows API,因为在进行设备I / O时, stdio会增加混乱。

select.h

与Unix select(2)系统调用没有直接的相关性。

在Windows中,许多内核对象可以处于有信号状态或无信号状态,并且可以使用信号发送对象的动作来释放称为WaitForMultipleObjects()的线程。 数据可用时,会发出一些但不是全部的HANDLE对象的信号。 具体来说,我知道WinSock中的HANDLE具有这种功能,但我不知道Comm API。 我知道,打开文件的HANDLE不对。

如果您需要等待正在处理窗口消息的线程中的事件,则应该使用MsgWaitForMultipleObjects()来代替,因为在线程被阻塞的情况下,它将正确地传递消息。

阅读MSDN文章使用同步的Windows同步原语。

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

MSDN有几篇关于I / O技术的文章,还有很多例子:

  • 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头文件与第三方工具头文件混合在一起是一个疯狂的道路。

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

我创建了2个文件,使用我在一些论坛中发现的代码绕过windows.h和Windows COM端口库:

“nowindows.h”

 /* file nowindows.h v1.0 use at your own risk * #ifndef DWORD #define WINAPI typedef unsigned long DWORD; typedef short WCHAR; typedef void * HANDLE; #define MAX_PATH PATH_MAX typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned int BOOL; #include <sys/types.h> #include <sys/stat.h> #include "unistd.h" #include <fcntl.h> #define GENERIC_READ O_RDONLY //read only mode #define GENERIC_WRITE O_WRONLY //write only mode #define CREATE_ALWAYS O_CREAT //create new file #define OPEN_EXISTING 0 //fake parameter's value #define FILE_ATTRIBUTE_NORMAL 0644 // file attributes #endif 

“nowindowscomport.h”

 /* file nowindowscomport.h v1.0 use at your own risk *// typedef struct _DCB { DWORD DCBlength; DWORD BaudRate; DWORD fBinary :1; DWORD fParity :1; DWORD fOutxCtsFlow :1; DWORD fOutxDsrFlow :1; DWORD fDtrControl :2; DWORD fDsrSensitivity :1; DWORD fTXContinueOnXoff :1; DWORD fOutX :1; DWORD fInX :1; DWORD fErrorChar :1; DWORD fNull :1; DWORD fRtsControl :2; DWORD fAbortOnError :1; DWORD fDummy2 :17; WORD wReserved; WORD XonLim; WORD XoffLim; BYTE ByteSize; BYTE Parity; BYTE StopBits; char XonChar; char XoffChar; char ErrorChar; char EofChar; char EvtChar; WORD wReserved1; } DCB, *LPDCB; typedef struct _COMSTAT { DWORD fCtsHold :1; DWORD fDsrHold :1; DWORD fRlsdHold :1; DWORD fXoffHold :1; DWORD fXoffSent :1; DWORD fEof :1; DWORD fTxim :1; DWORD fReserved :25; DWORD cbInQue; DWORD cbOutQue; } COMSTAT, *LPCOMSTAT; typedef struct _COMMTIMEOUTS { DWORD ReadIntervalTimeout; DWORD ReadTotalTimeoutMultiplier; DWORD ReadTotalTimeoutConstant; DWORD WriteTotalTimeoutMultiplier; DWORD WriteTotalTimeoutConstant; } COMMTIMEOUTS, *LPCOMMTIMEOUTS; #define ERROR_INVALID_HANDLE 6L /* Purge functions for Comm Port */ #define PURGE_TXABORT 0x0001 /* Kill pending/current @@-377,11 +382,4 @@ */ #define PURGE_RXCLEAR 0x0008 #define PURGE_TXCLEAR 0x0004 #define PURGE_RXABORT 0x0002 // DTR Control Flow Values. #define DTR_CONTROL_DISABLE 0x00 #define DTR_CONTROL_ENABLE 0x01 #define DTR_CONTROL_HANDSHAKE 0x02 #define RTS_CONTROL_DISABLE 0x00 #define NOPARITY 0 #define ONESTOPBIT 0