首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >与sys/select.h和termios.h中定义的功能等效的Windows功能是什么

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

Stack Overflow用户
提问于 2009-06-01 06:36:29
回答 3查看 49.3K关注 0票数 22

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

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

  1. 找不到sys/select.h
  2. Cannot find Termios.h

我该如何解决这个问题呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-01 06:51:02

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

termio.h

Windows使用与任何*nix系统非常不同的模型来执行终端I/O。因此,termios.h头和它的朋友之间没有直接的等价物。

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

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

通常,您会发现需要直接处理更多的Windows API,因为在执行设备I/O时,stdio会增加混乱。

select.h

没有与Unix select(2)系统调用直接等效的方法。

在Windows中,许多内核对象既可以是有信号的,也可以是无信号的,给对象发信号的行为可以用来释放调用WaitForMultipleObjects()的线程。当数据可用时,一些但不是所有的HANDLE对象都会被通知。具体地说,我知道来自WinSock的HANDLE具有该功能,但我不知道Comm API。我知道打开文件的HANDLE不是这样的。

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

在MSDN文章Using Synchronization上阅读有关Windows同步原语的信息。

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

MSDN有几篇关于I/O技术的文章,以及许多示例:

请注意,有关Windows如何工作的许多信息分散在API函数和结构的参考资料的概述文章和备注部分中。这可能会给人一种第一次阅读时没有完全记录的印象。

使用Cygwin进行移植

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

Cygwin已经做了相当多的繁重工作来构建一个在Windows上工作的select()实现,给出了不同的打开文件描述符的混合。这项工作就是described in the User's Guide

请注意,只有在Cygwin环境中进行构建时,才会记录和支持针对Cygwin的构建。通常,仅仅将Cygwin的bin放在Windows路径上并从命令提示符运行是不够的。您确实需要启动Cygwin的bash构建,并从那里进行编译,以便所有内容都使用相同的Cygwin风格的挂载点和模拟的Unix文件结构。

将Cygwin头文件与第三方工具头文件混合使用肯定会让人抓狂。

编辑:我稍微重新整理了一下,并添加了一些回复评论的材料。

票数 35
EN

Stack Overflow用户

发布于 2021-09-20 07:19:08

还有一个用于Windows的termios移植,叫做termiWin

Linux termiWin是一个库,它的目的是允许你在Window系统上使用,与在

中使用的代码相同,用于通过串口与设备通信。这是可能的,因为termios的函数已经被重写,以便与Windows的COM函数兼容。

票数 -1
EN

Stack Overflow用户

发布于 2012-08-05 21:33:21

我使用在一些论坛中找到的代码创建了两个文件,以绕过windows.h和windows com端口库:

"nowindows.h“

代码语言:javascript
复制
/* 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“

代码语言:javascript
复制
/* 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
票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/933745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档