Подтвердить что ты не робот

Что такое Windows, эквивалентная возможностям, определенным в sys/select.h и termios.h

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

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

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

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

4b9b3361

Ответ 1

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

termio.h

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

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

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

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

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. Однако вы получите приложение, зависящее от DLL Cygwin, которое является GPL, если вы не приобретете у них коммерческую лицензию. Это может быть сложно использовать Cygwin для получения приложения, которое хорошо работает для пользователя Windows без опыта работы с Unix, так как многие другие предположения о том, как устанавливаются и используются обе системы, отличаются.

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

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

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

Изменить: Я немного изменил настройки и добавил некоторые материалы в ответ на комментарии.

Ответ 2

Я создал 2 файла, используя код, который я нашел на некоторых форумах, чтобы обойти библиотеки windows.h и 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 <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 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