Deskriptoren von Eltern Prozess



  • hi,

    wie kann ein Kind Prozess auf Deskriptoren vom Eltern Prozess zugreifen? Soweit ich weiß, werden diese ja weitervererbt, aber die Variablen aus dem EP kann ich im KP ja nicht weiterverwenden. Muss ich die Deskriptoren per execl-Funktion an das Programm dann weitergeben oder wie macht man das?



  • Warum solltest du die Variablen nicht weiter verwenden können?



  • ok ich könnte sie verwenden, aber doch nur, wenn sie global in einer gemeinsamen Header Datei deklariert wäre, oder?

    Wenn der Deskriptor aber in einem lokalen Namensraum des EP deklariert würde, dann würde der KP die Variable ja vom Namen her nicht kennen, oder?

    Wenn ich dann die Variable per exec an KP übergebe, dann kann ich den Deskriptor neu zuweisen und der KP kann damit arbeiten.

    Oder bin ich auf dem Holzweg und es ist doch einfacher?



  • Mal langsam: Nach dem fork()-Aufruf haben beide Prozesse eine eigene Kopie aller Variablen in deinem Programm. Mit man: exec() wird die alte Programmumgebung komplett aufgeräumt und ein neues Programm geöffnet - danach kannst du auf keine der Variablen des Eltern-Programms mehr zugreifen. Wenn du dazwischen etwas an Daten retten willst, müsstest du sie vermutlich als Argumente an exec() mitgeben und am anderen Ende aus argv wieder rausdröseln.

    (ich hoffe, ich hab' nicht zuviel Unsinn erzählt - Unix ist nicht mein Spezialgebiet, da sind nur ein paar Fetzen noch hängengeblieben)



  • ok, d.h. ich muss wie im 1. posting geschrieben, die Deskirptoren per execl an das neue Programm übergeben. Korrekt? Anders gehts wohl nicht, die Deskriptoren aus dem EP zu bekommen, oder?



  • Wie CStoll richtig sagte, werden alle Variablen aus dem EP in den KP kopiert - DU hast also alle Werte die vor dem Fork zur Verfügung standen nach dem fork in beiden Prozessen. Nur wirkt sich (weil es eine Kopie ist) eine Änderung an diesen Werten eben nicht auf den anderen Prozess aus. Mit Sichtbarkeit im Sinne von Lookup und Namespaces hat das übrigens garnichts zu tun.

    Weiterhin müsstest Du tatsächlich die Deskriptoren, die Du ins Kindprogramm retten willst, beim exec übergeben. Das ist nicht weiter problematisch, da Deskriptoren auch nur Zahlen sind. Meistens will man das aber garnicht, sondern leitet STDIN/STDOUT auf die geerbten Deskriptoren um. BTW: Willst Du andere Deskriptoren als STDIN/STDOUT/STDERR an einen mit exec gestarteten Prozess vererben, musst Du zunächst das Close-On-Exec Flag löschen, sonst gehen diese beim exec nämlich wie der Rest auch ins Speicher-Nirvana.

    Wenn Du allerdings vorher weisst, welche Nummern Deine Desckriptoren haben werden, kannst Du im KP auch drauf zugreifen ohne sie im exec zu übergeben. Du könntest z.B. vor dem exec mit dup2(descriptor, 3) einen Deskriptor auf die 3 legen (0, 1 und 2 sind stdin/out/err), dann mit fcntl(3, F_SETFD, 0) das close-on-exec flag löschen und dann mit exec einen KP starten der den Deskriptor 3 benutzt.


Anmelden zum Antworten