wie kann child den parent Prozess benachrichtigen?
-
Hi,
gibt es eine Möglichkeit das der child Prozess den parent benarchtigt über z.B. den aktuellen Status?
Habe es bisher so geregelt, dass child meine Ausgabe in eine pipe schreibt (dup2(fd[1],STDOUT_FILENO)) und sich der parent prozess die Daten abholen kann.
Könnte so hochstens den Status da mit rein pipen und der parent pusselt sich die Meldungen wieder zusammen. Reagiert dann auch auch nur wenn er die Meldungen abfragt.
Ist das einfacher, effizienter möglich?
Vielleicht das child eine Methode von parent bei Statusänderung aufruft o.ä.?
Danke
Gruß,
arrow
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89, C99 und C11) in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Anstatt Pipes kann man Unix Signals verwenden. Dann kannst du eine Funktion im Parent-Prozess vom Child-Prozess aus "aufrufen". Das Problem ist dann allerdings, dass diese Funktionsaufrufe asynchron stattfinden, das heisst du hast keine Garantie in welchem Zustand sich dein Parent-Prozess gerade befindet. Somit ist es meistens oftmals sehr schwierig (oder gar unmoeglich) auf Signale reagieren zu koennen.
Was sind das denn fuer Status-Updates?
-
Hauptsächlich sollte erst der child Prozess bei Beendigung den Parent benachrichtigen.
-
Das geht wie schon erwähnt mit signal, und auch mit (Nichtstandard) sigaction.
-
icarus2 schrieb:
Anstatt Pipes kann man Unix Signals verwenden. Dann kannst du eine Funktion im Parent-Prozess vom Child-Prozess aus "aufrufen". Das Problem ist dann allerdings, dass diese Funktionsaufrufe asynchron stattfinden, das heisst du hast keine Garantie in welchem Zustand sich dein Parent-Prozess gerade befindet. Somit ist es meistens oftmals sehr schwierig (oder gar unmoeglich) auf Signale reagieren zu koennen.
Was sind das denn fuer Status-Updates?
Das ist gar nicht unmöglich. Es ist sogar relativ leicht. Man muss nur wissen wie.
Eine einfache Möglichkeit ist eine interne Pipe zu beschreiben. Der Prozess kann in seiner Eventloop dann erkennen, dass was gekommen ist wenn er mal in einem geeigneten Zustand ist. Oder einfach ein Flag setzen und im Prozess immer mal abfragen.
Das Problem ist, dass man im Signalhandler vieles nicht machen darf, da viele Funktionen nicht reentrant sind.
Aber wenn es darum geht, dass der Child über seine Beendigung seinen Parent benachrichtigen soll, dann wird das vom Betriebssystem bereits gemacht. Das Signal SIGCHLD wird automatisch an den Parent gesendet.