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

2024-10-28 08:37:00
admin
原创
409
摘要:问题描述:我在 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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用