Кроссплатформенный (linux / Win32) неблокирующий ввод-вывод C ++ на stdin / stdout / stderr - PullRequest
8 голосов
/ 24 ноября 2008

Я пытаюсь найти лучшее решение для неблокирующего ввода-вывода через stdin / stdout со следующими характеристиками:

  • До тех пор, пока данных достаточно, читайте куски n .
  • Если данных недостаточно, считайте частичный фрагмент.
  • Если данных нет, блокируйте их, пока они не появятся (хотя они могут быть меньше, чем n ).

Цель состоит в том, чтобы обеспечить эффективную передачу больших наборов данных при немедленной обработке «контрольных» кодов (вместо того, чтобы задерживать их в каком-то частично заполненном буфере где-либо).

Я знаю, что могу добиться этого, используя потоки и цикл istream :: get (), или написав кучу специфичного для платформы кода (поскольку вы не можете выбрать () для дескрипторов файлов в окнах) ... ((Существует также функция istream :: readsome (), которая выглядит многообещающей, но единственные результаты, которые я могу найти в Google, - это люди, которые говорят, что это на самом деле не работает.))

Поскольку я не слишком много программировал с этими API, возможно, есть лучший способ.

Ответы [ 3 ]

6 голосов
/ 24 ноября 2008

Может быть boost :: asio может быть полезным для вас?

1 голос
/ 15 августа 2009

Я использовал темы и специфический для платформы код. См. мой ответ на другой вопрос . Мне удалось поместить специфичные для ОС вещи в inputAvailable () (Linux использует select, Windows просто возвращает true). Затем я мог бы использовать WaitForSingleObject () с таймаутом в Windows, чтобы попытаться завершить поток, а затем TerminateThread (), чтобы завершить его. Очень некрасиво, но команда не хотела использовать это повышение.

0 голосов
/ 15 августа 2009

Я сделал что-то похожее на jwhitlock ... Я закончил с классом StdinDataIO, который оборачивается вокруг соответствующей реализации, специфичной для ОС (*), так что остальная часть моей программы может выбрать () в дескрипторе файла, который предоставляет StdinDataIO, оставаясь блаженно неосведомленный об ограничениях Windows относительно стандартного ввода. Посмотрите здесь и здесь , если хотите, код полностью с открытым исходным кодом / BSD-лицензирован.

(*) реализация представляет собой простой переход для Linux / MacOSX, а в Windows это довольно сложный процесс настройки дочернего потока для чтения из stdin и отправки полученных данных через сокет обратно в главный нить ... не очень элегантно, но работает.

...