Wenn Sie eine Datei an eine Unix-Pipe senden, friert Matlab ein

6

Ich habe eine Named Pipe unter Debian mit erstellt mkfifo pipe.in. Ich möchte diese Pipe von Matlab schreiben.

Dazu verwende ich den folgenden matlab-Befehl:

unix( 'cat <myfile> > pipe.in' )

Wo <myfile>ist eine Textdatei und pipe.inist die Pipe, mit der ich erstellt habe mkfifo.

In vielen Fällen stürzte der mit der Pipe verbundene Prozess aus verschiedenen Gründen ab (jedoch aus Gründen, die über die Verwendung des Befehls unix und cat hinausgehen). Der Absturz kann in mehreren Fällen normal sein.

Das Ausführen des obigen Befehls führt dazu, dass Matlab einfriert und ich die Kontrolle über Matlab nicht wiedererlangen kann CTRL+C.

Gibt es eine andere Möglichkeit, Matlab freizugeben, ohne dass ich den Prozess beenden muss?

Guuk
quelle
2
Versuchen Sie, den catBefehl im Hintergrund &
Wie hast du die Pipe erstellt?
Rody Oldenhuis
@EitanT Ich versuche es und es entsperrt MatLab, aber in meinem Fall muss ich warten, bis der Unix-Befehl beendet ist, um sicherzugehen, dass der Prozess abgeschlossen ist
@RodyOldenhuis Ich erstelle die Pipe wie folgt:mkfifo pipe.i; mkfifo pipe.out; time echo "<intern command of the executable>"| <executable> > log &
2
Was passiert, wenn du einfach catdie Datei ohne die Pipe hast , friert diese ein? Haben Sie versucht, die Pfeife mit matlab zu öffnen fopenund mit zu schreiben fprintf?
Slayton

Antworten:

2

Matlab entsperren

Sie können Matlab entsperren, indem Sie das QUITSignal senden , indem SieCTRL-\ auf das Terminal drücken , von dem aus Sie Matlab gestartet haben.

Warum Matlab friert

Matlab friert ein, weil die unixFunktion niemals zurückkehrt, weil sie cat <myfile> > pipeniemals beendet wird.

Das Ausführen cat <myfile> > pipe.inin einem Terminal zeigt dasselbe "Einfrieren" -Verhalten.

Mein Bash-Fu ist nicht sehr gut, aber ich denke, dass etwas aus der Pipe gelesen werden muss, bevor der Autor kündigen kann.

Erstellen Sie eine temporäre Pipe und Datei

mkfifo /tmp/tempPipe
echo "1 2 3 4 5 6 7 8 0" > /tmp/tempFile

Schreiben Sie an die Pipe

Dieser Befehl wird nicht beendet:

cat /tmp/tempFile > /tmp/tempPipe 

Dieser Befehl wird:

cat /tmp/tempFile > /tmp/tempPipe & cat < /tmp/tempPipe

Ich gehe davon aus, dass Ihr Matlab-Anruf unixbeendet wird , wenn Sie einen Lesevorgang erstellen .

Slayton
quelle
Das einfrierende "Verhalten" ist für mich kein echtes Problem. Im klassischen Fall würde ich erwarten, dass der gesamte Befehl durch die Pipe geht (weil ich warten muss, um andere Operationen auszuführen). Das Einfrierverhalten ist in einem Terminal kein Problem, da ich es durch Drücken von STRG + C stoppen kann. Aber in Matlab kann ich diesen Befehl nicht verwenden.
Zur Information: Der Hauptprozess, der vom Befehl über die Pipe verwaltet wird, ist eine numerische Lösung. In meinem Fall muss ich also Befehle über die Pipe an den Solvor senden (jede Befehlsgruppe führt zu einer numerischen Berechnung). Ich warte darauf, dass die Befehlsgruppe an die Pipe gesendet wird. Wenn der letzte Befehl an die Pipe gesendet wird, kann ich viele Vorgänge in MatLab fortsetzen, bevor neue Befehle gesendet werden.
Ich möchte nur das Einfrierverhalten stoppen, wenn der Solvor abstürzt (und die Pipe gelöscht wird).
@Guuk dann CTRL- \
slayton
Ich werde es versuchen, aber in Zukunft möchte ich mein Matlab-Programm auf einem Cluster verwenden, und ich kann dies nicht verwenden. Deshalb suchte ich nach einem Automatik so