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 所提供的系统调用和...

问题描述:

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

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

  1. 找不到 sys/select.h

  2. 找不到 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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用