Ich versuche die beste Lösung für nonblocking IO über stdin / stdout mit den folgenden Eigenschaften zu finden:
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.
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.
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.
Tags und Links c++ iostream pipe stdin nonblocking