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

StackOverflow https://stackoverflow.com/questions/315111

Вопрос

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

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

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

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

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

Это было полезно?

Решение

Может быть повышение::asio может быть вам полезен?

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top