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

时间:2009-06-01 06:36:29

标签: c linux winapi

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

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

  1. 找不到sys / select.h
  2. 找不到termios.h
  3. 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:33)

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

termio.h中

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

您想在MSDN上阅读有关Windows Communications Resources

的信息

要了解更多信息,请参阅:

一般情况下,您会发现需要直接处理Windows API,因为stdio会在进行设备I / O时增加混乱。

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层。但是,除非您从他们那里购买商业使用许可,否则您最终会得到一个依赖于Gg的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头文件与第三方工具头文件混合是疯狂的必然途径。

编辑:我重新安排了一下,并添加了一些材料以回应评论。

答案 1 :(得分:-2)

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

&#34; nowindowscomport.h&#34;

/* 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