Что такое Windows, эквивалентный возможностям, определенным в sys / select.h и termios.h - PullRequest
19 голосов
/ 01 июня 2009

У меня есть приложение в Linux, которое успешно скомпилировано. Я хочу запустить ту же программу в Windows.

Но при компиляции возникают следующие ошибки, связанные с заголовочными файлами.

  1. Не удается найти sys / select.h
  2. Не удается найти termios.h

Как я могу это исправить?

Ответы [ 2 ]

33 голосов
/ 01 июня 2009

Windows API структурно и стилистически сильно отличается от сочетания системных вызовов и библиотечных процедур, предоставляемых любой разновидностью Unix.

termio.h

Windows выполняет терминальный ввод-вывод с совершенно другой моделью из любой системы * nix. В результате действительно нет прямого эквивалента заголовку termios.h и его друзьям.

Вы хотите прочитать на MSDN о Windows Коммуникационные ресурсы .

Некоторые вещи, о которых вы можете узнать больше:

В общем, вы обнаружите, что вам нужно гораздо больше разбираться с Windows API напрямую, потому что stdio добавит путаницы при выполнении ввода / вывода устройства.

select.h

Нет прямого эквивалента системному вызову Unix select (2).

В Windows многие объекты ядра могут находиться в сигнальном или не сигнализированном состоянии, и акт сигнализации объекта может использоваться для освобождения потока, который вызвал WaitForMultipleObjects(). Некоторые, но не все HANDLE объекты сигнализируются, когда доступны данные. В частности, я знаю, что HANDLE из WinSock имеют такую ​​возможность, но я не знаю о Comm API. Я знаю, что HANDLE с открытым файлом нет.

Если вам нужно дождаться события в потоке, обрабатывающем оконные сообщения, вам, вероятно, следует использовать MsgWaitForMultipleObjects(), поскольку он будет правильно доставлять сообщения, в то время как поток блокируется в противном случае.

Прочтите о примитивах синхронизации Windows в статье MSDN Использование синхронизации .

Однако в Windows есть несколько видов асинхронного ввода-вывода, которые могут заменить необходимость в select() изменением конструкции. И то, и другое потребует широкого использования функций, которые нельзя использовать в сочетании с библиотекой C stdio.

В MSDN есть несколько статей о методах ввода-вывода, а также множество примеров:

Обратите внимание, что большая часть информации о том, как работает Windows, разбросана по обзорным статьям и разделам примечаний справочного материала по функциям и структурам API. Это может создать впечатление, что ничего не документировано полностью в первом чтении.

Портирование с Cygwin

Другой подход заключается в использовании Cygwin для создания порта. Он обеспечивает большую часть слоя POSIX поверх Windows API. Тем не менее, вы получите приложение, которое зависит от Cygwin DLL, которое является GPL, если вы не приобретете лицензию на коммерческое использование у них. Может быть сложно использовать Cygwin, чтобы получить приложение, которое хорошо работает для пользователя Windows, не имеющего опыта работы с Unix, поскольку многие другие предположения о способе настройки и использования двух систем отличаются.

Cygwin приложил немало усилий, чтобы создать реализацию select(), которая работает в Windows с учетом различных дескрипторов открытых файлов. Это усилие описано в руководстве пользователя .

Имейте в виду, что построение против Cygwin документируется и поддерживается только в том случае, если оно выполняется из среды Cygwin. Обычно недостаточно просто поместить корзину Cygwin в Windows PATH и работать из командной строки. Вам действительно нужно запустить сборку Cygwin для bash и выполнить компиляцию оттуда, чтобы все использовали одинаковые точки монтирования в стиле Cygwin и имитированную структуру файлов Unix.

Смешивание заголовочных файлов Cygwin со сторонними заголовочными файлами инструментов - верный путь к безумию.

Редактировать: Я немного перестроил и добавил несколько материалов в ответ на комментарии.

0 голосов
/ 05 августа 2012

Я создал 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...