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

Я не знаю, была ли это ваша проблема, но вы должны найти свои ошибки прямо здесь:

enter image description here

чтобы раскрыть все эти строки, чтобы получить ваши ошибки, в самом низу. Если у кого-то есть лучший способ сделать это, я тоже ищу.

20
задан Shog9 21 June 2009 в 21:35
поделиться

1 ответ

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

termio.h

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

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

Вот некоторые вещи, о которых стоит узнать больше:

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

select.h

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

В 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 с файлами заголовков сторонних инструментов - верный путь к безумие.

Edit: Я немного изменил и добавил материал в ответ на комментарии.

33
ответ дан 30 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: