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 со сторонними заголовочными файлами инструментов - верный путь к безумию.
Редактировать: Я немного перестроил и добавил несколько материалов в ответ на комментарии.