2017-08-28 2 views
0

Ich habe eine einfache application geschrieben, die zwei Threads hat. Der erste Thread druckt auf stdout und der zweite Thread liest von stdin.Umleiten stderr, stdout und stdin zu pipe blockiert den Prozess von

Ich habe stdin, stdout und stdin des Prozesses auf 3 verschiedene Rohre wie unten umgeleitet.

mkfifo pipe_in && mkifo pipe_out && mkfifo pipe_err 

./a.out < pipe_in 2> pipe_err 1> pipe_out & 

Problem ist, dass ich diese Anwendung (./a.out) vom Laufen blockiert, bis ich unten zu tun:

cat < pipe_out & 
cat < pipe_err & 
cat > pipe_in 

Warum ist diese Anwendung blockiert? Ist es, weil kein Körper von anderer Seite die pipe geöffnet hat?

Was ist die Problemumgehung für das Problem, wo ich meine Anwendung ausführen möchte, ohne dass es vollständig blockiert wird. Ich möchte nur den Thread, der auf Benutzereingaben wartet, um blockiert zu werden, und anderen Thread, um die Ausführung fortzusetzen.

Diese Anwendung wird beim Booten gestartet. Also sollte diese Anwendung ausgeführt werden, ohne für Benutzereingaben blockiert zu werden. Der Benutzer kann jederzeit "cat> pipe_in" verwenden, um mit der Eingabe von Details zu dieser Anwendung zu beginnen.

+0

Re "Workaround" - äh, warum * würde * der Rest Ihrer Anwendung blockiert werden? Threads sind separate Dinge ... – o11c

+0

Aber wenn du einen Daemon schreibst, sollte er einen Socket öffnen, um Informationen zu liefern, anstatt überhaupt stdio zu benutzen - oder benutze Signale für einen sehr groben Ansatz. – o11c

+0

@ o11c: Das ist eine Art Deamon, aber es hat Schnittstellen, um Benutzereingaben zu bekommen, um Informationen über diese Anwendung zu erhalten. Art des Testmodus, um bestimmte Dinge zu überprüfen. – avltree

Antwort

1

Die Umleitung erfolgt durch die Shell, bevor das Anwendungsprogramm gestartet wird. So a.out startet nicht und kann keine Threads erstellen, die irgendetwas tun, bis das Öffnen der Pipes abgeschlossen ist, und die Öffnen der Pipe schreiben Seiten (für 1 und 2) nicht abgeschlossen, bis die gelesenen Seiten geöffnet sind. (Das Öffnen einer Leseseite für 0 wird sofort beendet.)

Verwandte Themen