¿Cuál es el equivalente de Windows a las capacidades definidas en sys / select.h y termios.h

Tengo una aplicación en Linux, que se comstack con éxito. Quiero ejecutar el mismo progtwig en Windows.

Pero la comstackción produce los siguientes errores relacionados con los archivos de encabezado.

  1. No se puede encontrar sys / select.h
  2. No se puede encontrar termios.h

¿Cómo puedo arreglar esto?

La API de Windows es estructural y estilísticamente muy diferente de la combinación de llamadas al sistema y rutinas de biblioteca proporcionadas por cualquier sabor de Unix.

termio.h

Windows hace E / S de terminal con un modelo muy diferente de cualquier sistema * nix. Como resultado, realmente no hay un equivalente directo al encabezado termios.h y sus amigos.

Desea leer en MSDN sobre los recursos de comunicación de Windows.

Algunas cosas para aprender más incluyen:

  • La estructura DCB
  • La estructura COMMTIMEOUTS
  • BuildCommDCB()
  • SetCommState()
  • … y muchos más …

En general, encontrará que debe tratar mucho más con la API de Windows directamente porque stdio boostá la confusión al hacer E / S del dispositivo.

select.h

No hay un equivalente directo a la llamada al sistema de selección de Unix (2).

En Windows, muchos objetos kernel pueden estar en un estado señalizado o no señalizado, y el acto de señalizar el objeto se puede utilizar para lanzar un hilo que llamó a WaitForMultipleObjects() . Algunos, pero no todos, los objetos HANDLE se señalizan cuando hay datos disponibles. Específicamente, sé que HANDLE s de WinSock tiene esa capacidad, pero no sé acerca de la API Comm. Sé que HANDLE s a un archivo abierto no.

Si necesita esperar un evento en un hilo que está procesando mensajes de ventana, entonces probablemente debería usar MsgWaitForMultipleObjects() lugar, ya que entregará mensajes correctamente mientras el hilo esté bloqueado.

Lea sobre las primitivas de sincronización de Windows en el artículo de MSDN Uso de la sincronización .

Sin embargo, hay varios tipos de E / S asincrónicas integradas en Windows que pueden reemplazar la necesidad de select() por un cambio de diseño. Ambos requerirán un uso extensivo de características que no se pueden usar en combinación con la biblioteca C stdio.

MSDN tiene varios artículos sobre técnicas de E / S, así como numerosos ejemplos:

  • Conceptos de E / S
  • E / S síncrona y asíncrona
  • Sincronización y entrada y salida superpuestas
  • CreateFile() (especialmente la sección Comentarios)

Tenga en cuenta que gran parte de la información sobre cómo funciona Windows está dispersa entre los artículos de resumen y las secciones de comentarios del material de referencia para las funciones y estructuras de API. Esto puede dar la impresión de que nada está completamente documentado en una primera lectura.

Porting con Cygwin

Otro enfoque es usar Cygwin para hacer el puerto. Proporciona la mayor parte de una capa POSIX sobre la API de Windows. Sin embargo, terminará con una aplicación que depende de Cygwin DLL, que es GPL, a menos que compre una licencia de uso comercial de ellos. Puede ser complicado usar Cygwin para obtener una aplicación que funcione bien para un usuario de Windows sin experiencia en Unix, ya que muchas otras suposiciones sobre la forma en que se configuran y usan los dos sistemas difieren.

Cygwin ha realizado una gran cantidad de trabajo pesado para crear una implementación de select() que funciona en Windows dada una combinación de diferentes descriptores de archivos abiertos. Este esfuerzo se describe en la Guía del usuario .

Tenga en cuenta que construir contra Cygwin solo se documenta y admite si se realiza desde el entorno de Cygwin. Por lo general, no basta con colocar el contenedor de Cygwin en Windows PATH y trabajar desde el símbolo del sistema. Realmente necesitas lanzar la comstackción de bash de Cygwin y comstackr desde allí para que todo esté usando los mismos puntos de assembly de estilo Cygwin y la estructura de archivos Unix simulada.

Mezclar archivos de encabezado de Cygwin con archivos de encabezado de herramientas de terceros es un camino seguro hacia la locura.

Editar: He reorganizado un poco, y he añadido algo de material en respuesta a los comentarios.

Creé 2 archivos usando el código que encontré en algunos foros para eludir las bibliotecas windows.h y windows com port:

“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  #include  #include "unistd.h" #include  #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 

y

“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