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

18

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

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

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

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

    
задан Renjith G 01.06.2009 в 08:36
источник

2 ответа

32

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

termio.h

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

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

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

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

select.h

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

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

Если вам нужно ждать события в потоке, который обрабатывает оконные сообщения, то вам, вероятно, следует использовать 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. Обычно этого недостаточно, чтобы просто положить bin Cygwin в Windows PATH и работать из командной строки. Вам действительно нужно запустить сборку и сборку Cygwin, чтобы все использовало те же точки монтирования в стиле Cygwin и смоделировала структуру файлов Unix.

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

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

    
ответ дан RBerteig 01.06.2009 в 08:51
  • Это нормально, но смотрите о sys / select.h. Я включил путь Cygwin к моей командной строке с помощью набора PATH = C: \ cygwin \ bin;% PATH%, то также возникает такая же ошибка .. –  Renjith G 01.06.2009 в 08:55
  • D: \ usr \ xtensa \ XtDevToolsDE \ install \ tools \ RB-2008.4-win32 \ XtensaTools \ xtensa-elf \ src \ uclibc \ include \ s ys \ select.h (25): фатальная ошибка C1083: невозможно открыть include file: 'features.h': Нет такого файла или directo ry make.exe: *** [uartsim.obj] Ошибка 2 –  Renjith G 01.06.2009 в 11:17
  • Я добавил текст, описывающий мое понимание ситуации с помощью select (). Ваша проблема с features.h заключается в том, что вы использовали select.h из какой-то другой инструментальной цепочки, а не из Cygwin. Просто поставить Cygwin на PATH будет недостаточно, вы должны взять на себя обязательство использовать его для всего процесса сборки. На самом деле это одна из вещей, которые мне не нравятся в Cygwin. –  RBerteig 01.06.2009 в 22:58
  • спасибо дорогой друг. Я выполнил все свои строительные процедуры внутри cygwin.Тогда все в порядке и хорошо работает. Но во время выполнения есть некоторая ошибка. Я действительно хочу создать ту же программу в Windows, используя MS VS 2005. Для этого мне нужно воспроизвести всю логику, как у вас сказал eariler (нет API EQVnt в окнах). Но я думаю, что Windows-люди немного увлекаются этим r8? так что API-интерфейсы eqvln должны быть включены ... –  Renjith G 02.06.2009 в 08:06
  • Следует отметить, что есть вызов select (2) под Windows; однако он может использоваться только с сетевыми сокетами и не будет работать совместно с stdio и т. д. –  Jeremy Friesner 06.02.2010 в 00:19
Показать остальные комментарии
-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'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
    
ответ дан TheShadow 05.08.2012 в 15:33