Wie stdout-Puffer in den Speicher und schreiben Sie es von einem dedizierten thread
Ich habe eine C-Anwendung mit vielen worker-threads. Es ist wichtig, dass diese nicht blockieren, also wo die worker-threads schreiben müssen, um eine Datei auf der Festplatte, ich habe Sie schreiben ein Ringpuffer im Speicher, und haben dann ein eigener thread für das schreiben, die Puffer auf der Festplatte.
Den worker-threads blockieren Sie keine mehr. Der dedizierte thread kann sicher blockiert während des Schreibens auf der Festplatte, ohne die worker-threads (es werden nicht die Sperre beim schreiben auf die Festplatte). Meine Speicher-Puffer eingestellt ist, ausreichend groß bemessen sein, dass der writer-thread mithalten kann.
Diesem funktioniert alles Super. Meine Frage ist, wie Binde ich etwas ähnliches für stdout?
Konnte ich makro printf() zum schreiben in einen Speicher-Puffer, aber ich habe keine Kontrolle über den code, der vielleicht nach stdout schreiben (teilweise ist es in third-party-Bibliotheken).
Gedanken?
NickB
InformationsquelleAutor der Frage NickB | 2009-06-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich mag die Idee der Verwendung von
freopen
. Das könnte Sie auch umleiten könnenstdout
zu einem Rohr mit dup und dup2und verwenden Sie dannread
zu greifen, Daten aus der pipe.Etwas wie so:
InformationsquelleAutor der Antwort Nate Kohl
Wenn Sie mit der GNU libc, Sie könnte verwenden Speicher-streams.
InformationsquelleAutor der Antwort diapir
Können Sie "redirect"
stdout
in Datei mitfreopen()
.man freopen
sagt:Diese Datei gut sein könnte, eine Rohr - worker-threads schreiben, dass Rohr-und writer-thread hören.
InformationsquelleAutor der Antwort qrdl
Warum nicht wickeln Sie Ihre gesamte Anwendung in eine andere? Im Grunde, was Sie wollen, ist ein smart
cat
kopiert von stdin nach stdout, als Pufferung nötig. Dann verwenden Sie ein standard-stdin/stdout Umleitung. Diese kann getan werden, ohne änderung Ihrer aktuellen Anwendung überhaupt.InformationsquelleAutor der Antwort MSalters
Können Sie ändern, wie die Pufferung arbeitet mit
setvbuf()
odersetbuf()
. Es gibt eine Beschreibung hier: http://publications.gbdirect.co.uk/c_book/chapter9/input_and_output.html.[Bearbeiten]
stdout
ist wirklich einFILE*
. Wenn der vorhandene code funktioniert mitFILE*
s, ich sehe nicht, was verhindert, dass es aus der Arbeit mitstdout
.InformationsquelleAutor der Antwort Bastien Léonard
One-Lösung ( für beide Dinge, die Ihr tun), sich eine Sammlung schreiben über writev.
Jeder thread könnte zum Beispiel sprintf in eine iovec-Puffer und dann passieren die iovec Zeiger auf die writer-thread und es haben einfach Aufruf writev mit stdout.
Hier ist ein Beispiel für die Verwendung writev von Advanced Unix Programming
Unter Windows, die Sie verwenden würden WSAsend für eine ähnliche Funktionalität.
InformationsquelleAutor der Antwort Robert S. Barnes
Die Methode mit den 4096 bigbuf wird nur eine Art von Arbeit. Ich habe versucht, diesen code, und während es nicht erfolgreich zu erfassen stdout in den Puffer, es ist unbrauchbar in einem realen Fall. Sie haben keine Möglichkeit zu wissen, wie lange die aufgezeichneten Ausgang, also keine Möglichkeit zu wissen, Wann zu beenden, die Zeichenfolge '\0'. Wenn Sie versuchen, den Puffer bekommst du 4000 Zeichen Müll ausspucken, wenn Sie hatte, erfolgreich eingefangen 96 Zeichen an stdout ausgegeben.
In meiner Anwendung verwende ich ein perl-interpreter in das C-Programm. Ich habe keine Ahnung, wie viel Leistung wird ausspucken, von was auch immer-Dokument geworfen werden, bei der das C-Programm, und daher der obige code würde niemals zulassen, mich sauber zu drucken, die Ausgabe aus überall.
InformationsquelleAutor der Antwort Bob