Estoy tratando de encontrar la mejor solución para no bloqueante IO a través de la entrada estándar/salida estándar con las siguientes características:multiplataforma (Linux/Win32) sin bloqueo C++ IO en stdin/stdout/stderr
- Mientras hay suficientes datos, lea en n -los trozos de tamaño.
- Si no hay suficientes datos, lea en un fragmento parcial.
- Si no hay datos disponibles, bloquee hasta que haya alguno (aunque puede ser más pequeño que n).
El objetivo es permitir una transferencia eficiente para grandes conjuntos de datos mientras se procesan códigos de "control" inmediatamente (en lugar de tenerlos en algún buffer parcialmente rellenado).
Sé que puedo lograr esto mediante el uso de subprocesos y un ciclo istream :: get(), o escribiendo un montón de código específico de plataforma (ya que no puede seleccionar() en los identificadores de archivo en Windows) .. . ((También hay istream :: readsome() que parece prometedor, pero los únicos resultados que puedo encontrar en google fueron de personas que dicen que en realidad no funciona bien.))
Como no he hecho mucho codificación con estas API, tal vez hay una mejor manera.
Eso parece bastante prometedor (un gran martillo para un pequeño problema, pero probablemente valga la pena aprenderlo) ... ¡Gracias! –
Sí, esa es probablemente la mejor opción para E/S asíncronas portátiles, ya que el idioma no tiene soporte nativo para E/S * o * sin bloqueos. Tendrás que usar una biblioteca de algún tipo, y el impulso suele ser una buena apuesta. – jalf
(Si solo Win32 admite select() o poll() en identificadores arbitrarios en lugar de sockets) ... Después de investigar, he confirmado que puedo hacer lo que necesito e incluso hay un tutorial para configurarlo arriba: http://www.highscore.de/boost/process/process/tutorials.html#process.tutorials.async_io –