Gibt es da einen Puffer der Größe angehängt stdout?
Ich versuche zu finden, einige Informationen zu den Daten zugeordneten Grenzwerte stdout auf Windows. Ich kann nicht scheinen zu finden, die Informationen auf der MSDN-Website.
-
Gibt es ein limit, wie viel Daten können auf stdout geschrieben? Wenn ja, was passiert, wenn das limit erreicht ist? Ist das Daten verloren gehen?
-
Wenn stdout umgeleitet wird (zum Beispiel durch den Start des Prozesses aus .Net und mit dem ProcessStartInfo.RedirectStandardOutput Eigentum), hat das eine Wirkung auf, wie viel Daten geschrieben werden können? Wie ich gelesen habe von den Standardausgabe-stream aufrufen-Prozess, beeinflusst das die Grenzen?
-
Sind diese Grenzen in irgendeiner Weise einen Bezug zu named pipes?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt davon ab, wo es geht - aber ja, wenn Sie die Umleitung der Ausgabe in .NET können Sie leicht in Probleme, wenn Sie nicht Lesen Sie die Ausgabe. Wenn der Puffer läuft aus, schreibt nach stdout im Kindprozess blockiert werden. Ein common-ish Ursache des Stillstands ist ein "Eltern" - Prozess warten für das "Kind" zu verlassen, und dann Lesen Sie die Ausgabe, das wird nicht funktionieren, wenn das Kind braucht die Eltern, um die Ausgabe Lesen zu Pufferspeicher freigeben.
.NET gemacht hat, dieses etwas zu erleichtern, indem Sie einen event-driven Ansatz mit
Process.OutputDataReceived
undProcess.ErrorDataReceived
. Das heißt, Sie brauchen nicht zu start von zwei threads (ein zu Lesen, stdout, ein zu Lesen, stderr), nur um den Prozess blockieren...BeginOutputReadLine
und BeginErrorReadLine`, um die Dinge kick-off? Ich weiß nicht, was der Unterschied PowerShell machen würde. Wenn dies nicht funktioniert, schlage ich vor, du stellst eine neue Frage, mit einem minimale reproduzierbare Beispiel.Einige Dinge zu beachten:
1) Jon hat Recht - wenn der Puffer erreicht ist, wird die write-Aufruf in Ihr Teilprozess blockiert werden. Sie müssen zum entleeren des stdout-stream, wenn er nicht umgeleitet wird, irgendwo wird es automatisch entleeren - das ist wie eine Datei. Rohre müssen entleert werden, und in der Regel, wenn Sie "Anhängen", um einen Teilprozess' Ausgabe, Sie befestigen an einem Rohr.
2) Die I/O um ein Ausgabe-stream ist wahrscheinlich gepuffert, was bedeutet, dass, wenn der Subprozess schreibt einige Informationen in die Standardausgabe ohne explizites aufrufen von
flush()
- was fast immer der Fall ist, Sie können nicht sehen, die Ausgabe. Flush automatisch aufgerufen, wenn der Prozess beendet wird, also, wenn es einen kleinen Teilprozess sollten Sie OK sein, aber wenn es nicht, Sie haben keine wirkliche Möglichkeit zu zwingen, seinen Ausgang zu zeigen, wenn Sie es wollen.3) Named pipes sind im wesentlichen ein Puffer, der das OS verwaltet werden kann, geschrieben und gelesen - das heißt, Sie sind wie eine Datei, die Sie schreiben können, um von einem Prozess und Lesen von in einem anderen, ohne tatsächlich den Aufwand des habens einer Datei auf der Festplatte. Sehr praktisch für die Kommunikation zwischen Prozessen, die aber alle den I/O-Einschränkungen bei der Pufferung /vollständigen Puffer noch gelten.
stdout hat einen Puffer von 1024 bytes