Я не знаю, была ли это ваша проблема, но вы должны найти свои ошибки прямо здесь:
чтобы раскрыть все эти строки, чтобы получить ваши ошибки, в самом низу. Если у кого-то есть лучший способ сделать это, я тоже ищу.
Windows API структурно и стилистически сильно отличается от сочетания системных вызовов и библиотечных подпрограмм, предоставляемых любым вариантом Unix.
Windows выполняет терминальный ввод-вывод с моделью, сильно отличающейся от любой системы * nix. В результате действительно не существует прямого эквивалента заголовку termios.h
и его друзьям.
Вы хотите прочитать в MSDN о коммуникационных ресурсах Windows .
Вот некоторые вещи, о которых стоит узнать больше:
BuildCommDCB ()
SetCommState ()
В общем, вы обнаружите, что вам нужно гораздо больше иметь дело с Windows API напрямую, потому что stdio
добавит путаницы при выполнении ввода-вывода устройства.
Нет прямого эквивалента системному вызову select (2) Unix.
В Windows многие объекты ядра могут находиться либо в сигнальном, либо в несигнальном состоянии, и акт сигнализации объекта может использоваться для освобождения потока, который вызвал WaitForMultipleObjects ()
. Некоторые, но не все объекты HANDLE
сигнализируются, когда данные доступны. В частности, я знаю, что HANDLE
из WinSock имеют такую возможность, но я не знаю о Comm API. Я знаю, что HANDLE
открытого файла не работают.
Если вам нужно дождаться события в потоке, обрабатывающем оконные сообщения, то вам, вероятно, следует использовать MsgWaitForMultipleObjects ()
, так как он будет правильно доставлять сообщения, в то время как в противном случае поток заблокирован.
Прочтите о примитивах синхронизации Windows в статье MSDN Использование синхронизации .
Однако есть несколько видов асинхронного ввода-вывода, встроенных в Windows, которые могут заменить необходимость в select ( )
путем изменения конструкции. Оба потребуют широкого использования функций, которые нельзя использовать в сочетании с библиотекой C stdio.
В MSDN есть несколько статей по методам ввода-вывода, а также многочисленные примеры:
CreateFile ()
(особенно раздел «Примечания») Обратите внимание, что большая часть информации о том, как работает Windows, разбросана среди обзорных статей и примечаний разделы справочного материала по функциям и структурам API. Это может создать впечатление, что ничего полностью не задокументировано при первом чтении.
Другой подход - использовать Cygwin для переноса. Он предоставляет большую часть уровня POSIX поверх Windows API. Однако вы получите приложение, зависящее от Cygwin DLL, которая является GPL, если вы не приобретете у них лицензию на коммерческое использование. Может быть сложно использовать Cygwin для получения приложения, которое хорошо работает для пользователя Windows, не имеющего опыта работы с Unix, поскольку многие другие предположения о том, как эти две системы настроены и используются, различаются.
Cygwin сделал изрядную сумму тяжелой работы по созданию реализации select ()
, которая работает в Windows с учетом сочетания различных дескрипторов открытых файлов. Это усилие описано в Руководстве пользователя .
Имейте в виду, что сборка против Cygwin документирована и поддерживается только в том случае, если она выполняется из среды Cygwin. Обычно недостаточно просто поместить корзину Cygwin в Windows PATH и работать из командной строки. Вам действительно нужно запустить сборку Cygwin bash и скомпилировать оттуда, чтобы все использовало те же точки монтирования в стиле Cygwin и имитированную файловую структуру Unix.
Смешивание файлов заголовков Cygwin с файлами заголовков сторонних инструментов - верный путь к безумие.
Edit: Я немного изменил и добавил материал в ответ на комментарии.