【问题标题】:What is the Windows equivalent to the capabilities defined in sys/select.h and termios.h与 sys/select.h 和 termios.h 中定义的功能等效的 Windows 是什么
【发布时间】:2010-10-30 08:15:07
【问题描述】:

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

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

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

我该如何解决这个问题?

【问题讨论】:

    标签: c linux winapi


    【解决方案1】:

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

    termio.h

    Windows 使用与任何 *nix 系统完全不同的模型来执行终端 I/O。因此,确实没有直接等效于 termios.h 标头及其朋友。

    您想在 MSDN 上阅读有关 Windows Communications Resources 的信息。

    需要了解的更多内容包括:

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

    选择.h

    没有直接等效于 Unix select(2) 系统调用。

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

    如果您需要在处理窗口消息的线程中等待事件,那么您可能应该改用MsgWaitForMultipleObjects(),因为它会在线程被阻塞时正确传递消息。

    在 MSDN 文章 Using Synchronization 中了解 Windows 同步原语。

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

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

    请注意,有关 Windows 工作原理的大部分信息都分散在概述文章和 API 函数和结构参考材料的备注部分中。这会给人一种印象,即在初读时没有完全记录在案。

    使用 Cygwin 移植

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

    Cygwin 做了大量繁重的工作来构建select() 的实现,它可以在Windows 上运行,因为它混合了不同的打开文件描述符。这项工作是described in the User's Guide

    请注意,只有在 Cygwin 环境中进行构建时,才会记录和支持针对 Cygwin 的构建。仅将 Cygwin 的 bin 放在 Windows PATH 上并从命令提示符处工作通常是不够的。你真的需要启动 Cygwin 的 bash 构建并从那里编译,这样所有东西都使用相同的 Cygwin 风格的挂载点和模拟的 Unix 文件结构。

    将 Cygwin 头文件与第三方工具头文件混用是疯狂的必经之路。

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

    【讨论】:

    • 没关系..但是关于 sys/select.h 我已经通过 set PATH=C:\cygwin\bin;%PATH% 将 Cygwin 路径包含到我的命令提示符中,然后也是同样的错误发生..
    • D:\usr\xtensa\XtDevToolsDE\install\tools\RB-2008.4-win32\XtensaTools\xtensa-elf\src\uclibc\include\s ys\select.h(25):致命错误 C1083:无法打开包含文件:'features.h':没有这样的文件或目录 make.exe:*** [uartsim.obj] 错误 2
    • 我添加了一些文字来描述我对 select() 情况的理解。您对 features.h 的问题是您使用了来自其他工具链而不是 Cygwin 的 select.h。仅仅将 Cygwin 放在 PATH 上是不够的,您必须承诺在整个构建过程中使用它。这实际上是我不喜欢 Cygwin 的原因之一。
    • 感谢亲爱的朋友。我已经在 cygwin 中完成了所有构建程序。然后它可以正常工作。但是在执行时出现了一些错误。我真的很想在 windows 中使用 MS VS 2005 构建相同的程序。为此,我需要像你之前所说的那样替换整个逻辑(Windows 中没有 EQVnt API)。但我认为 Windows 人对这个 r8 有点意识?因此应该包含 eqvln API ...
    • 需要指出的是Windows下有select(2)调用;但是它只能与网络套接字一起使用,并且不能与stdio等一起使用。
    【解决方案2】:

    还有一个用于 Windows 的 termios 移植,称为 termiWin

    termiWin 是一个库,其目的是允许您在 Windows 系统上使用,与 Linux 中用于通过串行端口与设备通信的代码相同。这是可能的,因为 termios 的函数已被重写以兼容 Windows 的 COM 函数。

    【解决方案3】:

    我使用在一些论坛中找到的代码创建了 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多