Ответ 1
Windows API структурно и стилистически очень отличается от сочетания системных вызовов и библиотечных процедур, предоставляемых любым вкусом Unix.
termio.h
Windows делает терминальные ввода-вывода с совершенно другой моделью из любой системы * nix. В результате на самом деле нет прямого эквивалента заголовку termios.h
и его друзьям.
Вы хотите прочитать в MSDN о Windows Коммуникационные ресурсы.
Некоторые вещи, чтобы узнать больше о:
- Структура DCB
- Структура COMMTIMEOUTS
-
BuildCommDCB()
-
SetCommState()
- ... и многое другое...
В общем, вы обнаружите, что вам нужно больше работать с 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 есть несколько статей по методам ввода-вывода, а также многочисленные примеры:
- Основные понятия ввода/вывода
- Синхронный и асинхронный ввод-вывод
- Синхронизация и перекрытие ввода и вывода
-
CreateFile()
(особенно раздел "Примечания" )
Обратите внимание, что большая часть информации о том, как работают 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 со сторонними файлами заголовков инструментов - верный путь к безумию.
Изменить: Я немного изменил настройки и добавил некоторые материалы в ответ на комментарии.