Windows 中与 sys/select.h 和 termios.h 中定义的功能等效的是什么
- 2024-10-28 08:37:00
- admin 原创
- 64
问题描述:
我在 Linux 中有一个应用程序,已成功编译。我想在 Windows 中运行相同的程序。
但编译时会产生与头文件相关的以下错误。
找不到 sys/select.h
找不到 termios.h
我该如何修复此问题?
解决方案 1:
Windows API 在结构和风格上与任何版本的 Unix 所提供的系统调用和库例程的混合非常不同。
termio.h
Windows 的终端 I/O 模型与任何 *nix 系统都大不相同。因此,实际上没有与 headertermios.h
及其相关项直接等效的模型。
您想在 MSDN 上阅读有关 Windows通信资源的信息。
需要进一步了解的内容包括:
DCB结构
COMMTIMEOUTS结构
BuildCommDCB()
SetCommState()
...还有更多...
一般来说,您会发现需要直接处理更多 Windows API,因为stdio
这会增加执行设备 I/O 时的混乱。
选择器
没有与 Unix select(2) 系统调用直接等效的函数。
在 Windows 中,许多内核对象可以处于有信号或无信号状态,向对象发送信号的行为可用于释放调用的线程。当数据可用时,WaitForMultipleObjects()
部分(但并非所有)对象都会发出信号。具体来说,我知道WinSock 中的 有此功能,但我不知道 Comm API。我知道打开文件的 不具备此功能。HANDLE
`HANDLE`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 的应用程序,而 Cygwin DLL 是 GPL 的。使用 Cygwin 获得一个适用于没有 Unix 经验的 Windows 用户的应用程序可能很棘手,因为关于这两个系统的设置和使用方式的许多其他假设都不同。
Cygwin 付出了大量努力来构建一个可以select()
在 Windows 上运行的实现,该实现提供了不同的打开文件描述符组合。此工作在用户指南中进行了描述。
请注意,只有在 Cygwin 环境中进行构建时,才会记录和支持针对 Cygwin 的构建。通常,仅将 Cygwin 的 bin 放在 Windows PATH 上并从命令提示符下工作是不够的。您确实需要启动 Cygwin 的 bash 构建并从那里进行编译,以便所有内容都使用相同的 Cygwin 样式的挂载点和模拟的 Unix 文件结构。
将 Cygwin 头文件与第三方工具头文件混合肯定会导致疯狂。
编辑:我进行了一些重新安排,并添加了一些材料以回应评论。
解决方案 2:
还有一个适用于 Windows 的 termios 移植版本,称为termiWin。
termiWin 是一个库,其目的是允许您在 Windows 系统上使用与 Linux 中相同的代码通过串行端口与设备通信。这是可能的,因为 termios 的函数已被重写以与 Windows 的 COM 函数兼容。
解决方案 3:
我使用在一些论坛中找到的代码创建了 2 个文件来绕过 windows.h 和 windows com 端口库:
“无窗口.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
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件