Plattformübergreifendes (linux / Win32) nicht blockierendes C ++ IO auf stdin / stdout / stderr

8

Ich versuche die beste Lösung für nonblocking IO über stdin / stdout mit den folgenden Eigenschaften zu finden:

  • Solange genügend Daten vorhanden sind, lesen Sie n -große Abschnitte.
  • Wenn nicht genügend Daten vorhanden sind, lesen Sie einen Teilabschnitt.
  • Wenn keine Daten verfügbar sind, blockieren Sie, bis einige vorhanden sind (auch wenn sie kleiner als n sind).

Das Ziel besteht darin, eine effiziente Übertragung für große Datensätze zu ermöglichen, während Kontrollcodes sofort verarbeitet werden (anstatt sie irgendwo in einem teilweise gefüllten Puffer zu belassen).

Ich weiß, dass ich das erreichen kann, indem ich Threads und eine istream :: get () - Schleife benutze, oder indem ich eine Menge plattformspezifischen Code schreibe (da man Dateigriffe in Windows nicht auswählen kann ()) ... ((Es gibt auch istream :: readsome (), was vielversprechend erscheint, aber die einzigen Ergebnisse, die ich bei Google finden kann, waren Leute, die sagen, dass es nicht wirklich gut funktioniert.))

Da ich mit diesen APIs nicht viel programmiert habe, gibt es vielleicht einen besseren Weg.

    
Dan S. 24.11.2008, 19:11
quelle

3 Antworten

6

Vielleicht kann boost :: asio für Sie nützlich sein?

    
activout.se 24.11.2008, 19:14
quelle
1

Ich habe den Thread und den plattformspezifischen Code verwendet. Siehe meine Antwort auf eine andere Frage . Ich war in der Lage, das OS-spezifische Zeug in inputAvailable () zu setzen (Linux verwendet Select, Windows gibt nur true zurück). Ich könnte dann WaitForSingleObject () mit einem Timeout unter Windows verwenden, um zu versuchen, den Thread abzuschließen, und dann TerminateThread (), um ihn zu beenden. Sehr hässlich, aber das Team wollte diesen Boost nicht nutzen.

    
jwhitlock 14.08.2009 23:37
quelle
0

Ich habe etwas Ähnliches wie jwhitlock gemacht ... Am Ende habe ich eine StdinDataIO-Klasse, die die entsprechende betriebssystemspezifische Implementierung (*) umschließt, so dass der Rest meines Programms den Dateideskriptor StdinDataIO auswählen kann () glücklicherweise ignorierte Windows die Einschränkungen in Bezug auf Standard. Sehen Sie sich hier und hier wenn Sie möchten, ist der Code Open-Source / BSD-lizenziert.

(*) Die Implementierung ist ein einfaches Pass-Through für Linux / MacOSX und in Windows ist es ein ziemlich komplexer Prozess, einen Kind-Thread zum Lesen von stdin einzurichten und die Daten, die er über einen Socket erhält, an den main zu senden Thread ... nicht sehr elegant, aber es funktioniert.

    
Jeremy Friesner 14.08.2009 23:46
quelle

Tags und Links