Kindprozesse beenden wenn der Elternprozess beendet wird?

  • Hallo,


    hat zwar nicht direkt mit VDR zu tun, aber da ich weiß das hier einige C-Profis sind, frage ich trotzdem mal nach.


    Ich schreibe gerade an einem Programm, welches einen "Elternprozess" hat, welcher blockierend auf ein Ereignis wartet (udev). Immer wenn das Ereignis eintritt forkt der Elternprozess einen Kindprozess weg, welcher sich an das verfügbar gewordene Device hängt. Werden soll das letztlich ein Usermode-Treiber.


    Das ganze funktioniert im Test schon einigermaßen. Problematisch ist aber das Beenden. Wenn ich den Elternprozess beende, dann laufen die Kindprozesse munter weiter. Sollen sie aber nicht.


    Gibt es einen eleganten Weg um das zu lösen? Kann man irgendwie ein Signal erhalten wenn der Elternprozess beendet wird oder muss ich selber eine Liste der PIDs führen, die ich lostrete? Dazu kommt, dass die Kindprozesse sich ja auch beenden könnten und PIDs recycled werden. Wenn eine PID in meiner Liste also längst anders vergeben ist, dann wird ein unbeteiligter Prozess beendet...


    Vermutlich ein Problem das irgendwo schon gelöst wurde, aber ich werde aktuell nicht fündig.


    Prozesse sind ja auch als Prozessgruppen organisiert. Mein Hauptprozess wird mit "daemon()" in den Hintergrund geschoben. Wenn ich das richtig verstehe wird auch eine neue "Session" gestartet. Könnte man nicht die irgendwie komplett wegräumen wenn der Hauptprozess beendet wird?


    Danke für jeden Tipp.

  • Warum nutzt du nicht systemd dafür? Das sollte automatisch aufräumen.
    Ansonsten müsste sich ein Kind beim Elternprozess abmelden, wenn es sich beendet, dann killst du nicht aus Versehen was falsches.


    Oder du benutzt Threads statt Prozesse, dann gibt es das Problem gar nicht erst.


    Lars

  • Wenn es etwas kleiner sein soll als systemd, kommen vllt cgroups infrage (welche systemd auch dafür verwendet).


    Oder, wie mini schon sagte, die Prozesse müssen sich beim Elternprozess abmelden. In Chromium sieht das so aus.

  • Threads wären auch eine Option. Sofern man nicht doch irgendwo etwas verwendet das nicht "Thread-Safe" ist. Ich werde mir da mal Gedanken machen.


    Allerdings dachte ich, man könnte später eventuell mal so umbauen, dass die "Kindprozesse" ihre Root-Rechte "abgeben". Das wäre mit Threads nicht möglich.


    Das ganze wird später sowieso von systemd ausgeführt. Ich will aber, wenn der Aufwand sich in Grenzen hält, zumindest die Option behalten, dass auch andere Init-Systeme den Daemon starten und beenden können. Wobei ein "killall" zum Beenden natürlich immer geht.


    Was ich noch gefunden habe:


    http://linux.die.net/man/2/kill

    Zitat


    If pid is less than -1, then sig is sent to every process in the process group whose ID is -pid.


    Wie ich das genau in den Hauptprozesse gebastelt kriege (Prozessgruppe erstellen, deren ID rausfinden und dann beim Beenden des Hauptprozesses die Prozessgruppe beenden) muss ich aber noch rausfinden.

  • Wenn du einen usermode Treiber schreiben wllst, wäre für char devices CUSE evtl. eine Option. Hat zwar nix mit kind prozessen direkt zu tun, könnte aber evtl. dein Problem lösen.

  • Es wird ein Treiber für ein Eingabegerät und dafür gibt es bereits "uinput" als einfache Schnittstelle für Usermode-Treiber.


    Allerdings frage ich mich wie sinnvoll es überhaupt ist, einen Treiber die Rechte "abwerfen" zu lassen. Vom Benutzer zum Treiber zurück kann nur über uinput selbst kommuniziert werden und das auch nur über klar definierte Schnittstellen.

  • Normal beenden sich alle Childs, wenn der Parent stirbt oder gekillt wird.
    Man muß extra Aufwand betreiben damit der Child den Tod des Parents überlebt.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Das stimmt so leider nur wenn es auch ein "Controlling Terminal" gibt. Das ist bei Daemons aber eher selten der Fall.


    Scheint mir so als hätte ich zwei Optionen.


    Beim "Parent" sollte ich alle Kindprozesse beenden können, wenn ich "kill(-getpid() ..." verwende. Das müsste dann in einem Signalhandler geschehen der alle gängigen Signale abfängt die zum Beenden des Parent führen würden.


    Oder ich baue auf Threads um. Die haben aber den Nachteil das der Speicher geshared wird. Der Device-Pfad liegt z.B. an einer Adresse, die von udev im Hauptthread wieder freigegeben wird. Also vorher alles, was über die Threadgrenze muss, in neuen Speicher kopieren und im gestarteten Thread freigeben.

  • Danke nochmal für die Tipps.


    Ich habe jetzt gestern auf Threads umgebaut.


    Da ich nich sicher weiß, wann libudev seine Werte freigibt, kopiere ich die erst in neuen Speicher und gebe den dann im gestarteten Thread wieder frei.


    Bisher funktioniert das einwandfrei.


    Kennt jemand einen komfortablen Weg um den von einem Prozess (PID bekannt) erzeugten "Thread-Baum" auf der Konsole anzuzeigen? Im Gegensatz zu Prozessen sind die Threads für mich aktuell relativ unsichtbar.

  • - Client1: Thermaltake DH 102 mit 7" TouchTFT * Debian Stretch/vdr-2.4.0/graphtft/MainMenuHooks-Patch * Zotac H55-ITX WiFi * Core i3 540 * 4GB RAM ** Zotac GT630 * 1 TB System HDD * 4 GB RAM * Harmony 900 * satip-Plugin

    - Client2: Alfawise H96 Pro Plus * KODI
    - Server: Intel Pentium G3220 * DH87RL * 16GB RAM * 4x4TB 3.5" WD RED + 1x500GB 2.5" * satip-Plugin
    - SAT>IP: Inverto iLNB

  • Da ich nich sicher weiß, wann libudev seine Werte freigibt


    Wie genau greifst du denn auf udev zu? Benutzt du libudev mit "struct udev" und Konsorten? Dann wird der Speicher vermutlich freigegeben, wenn du das entsprechende unref aufrufst.
    Das Kopieren der Daten ist sicherlich eine gute Idee.


    Lars.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!