Wie kann Prozess A an stdin von Prozess B schreiben?



  • Hallo! Mich würde mal interessieren, ob und wie es möglich ist, aus einem Prozess A mittels write an stdin von Prozess B zu schreiben, wobei Prozess B schon läuft(also nicht mit exec und dup). Eine Shell macht das ja über den exec und dup Weg, dass hat leider den Nachteil, dass es für bereits laufende Prozesse nicht funktioniert.

    Kennt ihr eine Lösung für das Problem?



  • Also, wenn du eine Distrbution verwendest, wo das proc-Filesystem gemount wird, ist das eigentlich keine große Sache.
    Du ermittelst dir die PID von Prozess B und Prozess A schreibt das was du an B schicken willst nach "/proc/<PID_VON_B>/fd/0" .

    Ich hab das mal mit 'cat' probiert... in eine Konsole 'cat > test' eingeben fuer einen wartenden Prozess, mit 'ps -a' die PID ermittelt und einfach 'echo "std_test" > /proc/<pid>/fd/0' gesendet. Das musst du nur noch halt selbst implementieren.

    TLEP



  • Hallo und Danke!

    Wenn ich das allerdings ausprobiere erscheint zwar der Text auf der Shell, jedoch steht anschließend nichts in der Datei. 😕



  • ah, ja sorry, mein Fehler... Filedeskriptor 0 ist stdout, 1 ist stdin...
    mit 1 funktioniert es, man sieht dann zwar nix mehr auf der Konsole, aber das ist ja nicht ganz so wichtig.

    Ich würde das ganze aber mit Vorsicht genießen. Wenn der Prozess keine Eingabe erwartet bekommst du Fehler.
    Das beste wäre, wenn du Prozess B selbst geschrieben hast, den mit popen(..) in A startest. popen(..) erzeugt die eine unnamed pipe zwischen den Prozessen. Oder, wieder unter der Voraussetzung das du B selbst schreibst, du nutzt unix domain socket. Es gibt natürlich noch einige andere Möglichkeiten der Interprozesskommunikation.



  • Danke das klapp! Mir ist aber gerade aufgefallen, dass wir beide einen Denkfehler haben. 0 Ist schon stdin, aber in dem cat Beispiel müssen wir ja an stdout schreiben, damit es in der Datei landet. Ich habe aber genau das umgekehrte Probleme: Eine Anwendung wartet auf eine Eingabe und die will ich von einem zweiten Prozess aus senden.

    Wenn ich auf einer Shell einfach cat Aufrufe, gibt es jeweils die Zeile wieder aus, die ich zuvor eingegeben habe. Sende ich aber aus einem zweiten Prozess, so erscheint die Eingabe nur einmal und kommt anscheinend intern bei cat nie an, als ob eine Art flush fehlen würde.



  • Die einfachsten Sachen vergisst man^^

    Ja gut, aber das sind die Besonderheiten von cat.
    Allgmeine sollte aber es funktionieren.



  • Hmmm, also egal auf welche Art ich es versuche es scheint nicht anzukommen(obwohl es auf der Shell angezeigt wird). Ich habe zum Testen einfache Programme geschrieben, die mit fgets lesen und dann mit puts das gelesene wieder zurückschreiben.

    Merkwürdig - mit stdout funktioniert es prima, mit stdin leider gar nicht.



  • Hennnne schrieb:

    Merkwürdig - mit stdout funktioniert es prima, mit stdin leider gar nicht.

    guck dir das /proc/fd-verzeichnis doch mal mit ls -l an. Da siehst du dass, im Falle von cat > test, der link für stdout (also /proc/.../fd/1) auch nur ein Softlink auf die Datei 'test' ist. Wenn man da jetzt nochmal was reinschreibt, landet es natürlich auch einfach in der Datei. Völlig unabhängig von dem Programm was die Datei auch schon offen hat.

    Und da sieht man auch, dass stdin nur ein Link auf das Terminal ist. Wenn man da was reinschreibt, gibt das Terminal das zwar aus, aber mehr auch nicht.

    Man könnte dem Terminal höchstens via ioctl(TIOCSTI) Eingaben schicken.


Anmelden zum Antworten