Ich habe zwei separate Prozesse: ein C-Programm, das kommagetrennte Werte gefolgt von einem Zeilenumbruch jede Sekunde ausgibt, und ein Perl-Programm, das Daten akzeptiert (im selben Format) und diese Daten verarbeitet.
Das C-Programm gibt Werte (über printf) als solche aus:
%Vor%Das Perl-Programm sitzt in einer Endlosschleife, die auf einer Zeilenbasis für STDIN wartet, um diese Daten zu verarbeiten:
%Vor%Ich möchte, dass diese beiden Prozesse in Echtzeit kommunizieren. Standard-Bash-Pipes funktionieren nicht (z. B. process1 | process2), da das Perl-Programm darauf wartet, dass das erste Programm beendet wird, bevor die Eingabe verarbeitet wird.
Hat jemand irgendwelche Ideen, Vorschläge oder Einsichten bezüglich einer Lösung für dieses Problem? Vielen Dank im Voraus!
Rohre sollten dafür gut sein; Sie müssen nur kontrollieren, wann die Ausgabe Ihres C-Programms gelöscht wird, um sie dem Perl-Skript inkrementell zur Verfügung zu stellen. Sie können dies im C-Programm tun, indem Sie fflush()
verwenden C-Programm wird ausgegeben, damit das Perl-Programm es lesen kann.
Es gibt nichts inhärent an Pipes, das dazu führen würde, dass das Perl-Programm auf das Schreiben des C-Programms wartet, bevor es seine Ausgabe verarbeitet. Ihr Perl-Programm ist so geschrieben, dass es STDIN
Zeile für Zeile verarbeitet:
<>
liest in diesem Zusammenhang eine Zeile von STDIN
, aber wenn es keine gibt, wird sie blockiert, bis eine ist. Ein Aufruf von fflush()
aus dem C-Programm wird dies ermöglichen.
Sehen Sie sich den Wikipedia-Artikel zu Pipelines an. Im Abschnitt zur Implementierung wird kurz beschrieben, wie Pipes gepuffert werden, damit Sie besser verstehen können, wie Ihre Prozesse kommunizieren. Pipes do ermöglichen den gleichzeitigen Zugriff zwischen Prozessen, und Prozesse, die von Pipes lesen und in sie schreiben, werden vom Scheduler genauso wie andere Prozesse verwaltet. Dein Problem hier ist mit der Pufferung.
Das C-Programm sollte seine Ausgabepuffer explizit fflush () oder eine pty verwenden. Letzteres ist viel peinlicher, hält aber den C-Code einfacher. Versuchen Sie "man 3 fflush", wenn Ihnen das nicht bekannt ist.