definierten Prozess killen



  • Hi rüdiger,
    wenn man einen Prozess forkt und dann im Kindprozess execl() aufruft entspricht die PID des neuen Prozesses doch nicht mehr dem Rückgabewert des fork-Aufrufs, da mit execl() ein neuer Prozess gestartet wird. Oder habe ich da was falsch verstanden.
    Man könnte den Prozess den man starten will beim Start die PID in das Verzeichnis /var/run (debian) schreiben lassen. Da kann dann ein anderer Prozess die PID nachschauen.

    Gruß Alexander



  • Hallo,

    ich habe gestern Abend das Problem,nur so zum Test, versucht anderes zu lösen:

    Ich habe in dem Programm, was die Endlosschleife drin hat, mit getpid() dessen PID ermittelt und diese in eine Datei geschrieben.
    Das Hauptprogramm, kann,wenn es das 2. Programm killen möchte, in der Datei nachschauen und mit "kill PID" das 2. Programm killen.
    Das funktioniert, hat aber keinen schönen Charme, ist für mich wie eine Notlösung, das mit dem fork() wäre eleganter, habe ich aber noch nicht getestet, muss ich noch.
    Wenn Rudiger recht hat, dann würde es gehen, wenn nicht, dann muss ich es mit der Datei machen?

    Gruss Alex 🙂



  • Es geht so wie Rüdiger gesagt hat, denn exec* startet keinen neuen Prozess (das hat fork ja auch schon getan), sondern ersetzt den aktuellen Prozess durch das per exec* angegebene Programm.



  • Amtrak schrieb:

    wenn man einen Prozess forkt und dann im Kindprozess execl() aufruft entspricht die PID des neuen Prozesses doch nicht mehr dem Rückgabewert des fork-Aufrufs, da mit execl() ein neuer Prozess gestartet wird. Oder habe ich da was falsch verstanden.

    Nö, deswegen habe ich ja auch auf die Manpage verlinkt

    execl(3) schrieb:

    The exec family of functions replace the current process image with a new
    process image.



  • Hallo,

    also müßte es so gehen:

    #include <unistd.h>
    #include  <sys/types.h>
    
    int main(void)
    {
    int pid;
    char befehl[255];
    
    switch( pid=fork() ) {
      case -1:   /* Fehler bei fork() */ break;
      case  0:   /* Hier befinden Sie sich im Kindprozess */ 
             int rc=execle("/home/alex/entw/MEINPROGRAMM2");
             break;
      default:   /* Hier befinden Sie sich im Elternprozess */ break;
    
    printf ("Der PID von Programm 2 ist: %d",pid);
    
    //Prozess killen:
    sprintf(befehl,"kill %i","pid");
    rc=system("befehl");
    return 0;
    }
    

    * ⚠ nicht Compiler getestet, nur als Idee ⚠

    Gruss Alex 🙂



  • Naja, fast 😃

    1. Alle exec-Funktionen haben mindestens zwei Parameter, und die Liste muss mit einem Nullpointer abgeschlossen sein.
    2. execle erwartet hinten dran noch einen Zeiger auf das Environment, hat also mindestens drei Parameter.
    3. Sollte exec doch mal fehlschlagen, springt das Programm mit break aus dem Switch-Statement. Dein Programm läuft jetzt zweimal. Besser mit exit beenden.
    4. Du schreibst in die Variable befehl, übergibst dem Betriebssystem aber dann den String "befehl"? Ist wohl ein Flüchtigkeitsfehler? 😉
    5. Zuerst nen Prozess zu forken und den dann mit System über den Shell-Befehl kill zu beenden, ist wohl mehr als durch Rektum ins Auge 😃

    Empfehlungen:
    zu 1./2. execl("/home/alex/entw/myprog", "myprog", NULL);
    zu 3. Statt break z.B. exit(127)
    zu 5. man(2) kill



  • Hallo,

    Danke für die Korrekturen, ich habe z.T. nicht zuende gedacht, vorallem nicht bei 5tens ... Danke
    Die anderen Punkte werd ich korrigieren!

    ⚠ Das mit dem "kill" war wirklich bescheuert *lach* ⚠

    Danke nochmal für die Hilfe 👍

    Gruss Alex

    Korrektur:

    #include <unistd.h>
    #include  <sys/types.h>
    
    int main(void)
    {
    int pid;
    char befehl[255];
    
    switch( pid=fork() ) {
      case -1:   /* Fehler bei fork() */ break;
      case  0:   /* Hier befinden Sie sich im Kindprozess */
             int rc=execle("/home/alex/entw/MEINPROGRAMM2","MEINPROGRAMM2",NULL);
             exit(127);
      default:   /* Hier befinden Sie sich im Elternprozess */ break;
    
    printf ("Der PID von Programm 2 ist: %d",pid);
    
    //Prozess killen:
    
    rc=kill(pid,9);
    return 0;
    }
    


  • Hallo,

    ich habe mal zeit gefunden mein Projekt weiter zu coden, aber ich habe das Problem, das

    int rc=execle("/home/alex/entw/MEINPROGRAMM2","MEINPROGRAMM2",NULL);
    

    funktioniert ... echt nicht, es kommt nur ein Returncode von -1 😕 😕
    hat jemand ein Idee, was das sein könnte, Berechtigungen von MEINPROGRAMM2 sind 777 ... zum testen okay.

    Hilfe!!!

    Gruss Alex



  • du benutzt execle falsch. Was du willst ist glaube ich execl (Bedenke, das execle auch noch einen Parameter für die Environment verlangt!)

    Ansonsten solltest du _immer_ auch den Wert von errno angeben (oder am besten mittels perror direkt eine lesbare Fehlermeldung), wenn eine Funktion fehlschlägt. Wenn exec* -1 zurück gibt, kann das so gut wie alles bedeuten!



  • rüdiger schrieb:

    du benutzt execle falsch. Was du willst ist glaube ich execl (Bedenke, das execle auch noch einen Parameter für die Environment verlangt!)

    Hallo rüdiger, stimmt.
    Mit

    rc=execl("./MEINPROG2","./MEINPROG2",(char *) 0);
    

    Funktioniert es 🙂

    Danke Gruss Alex 🕶



  • Du willst nicht execle sondern execlp benutzen. Oder genauer gesagt:

    int rc=execle("/home/alex/entw/MEINPROGRAMM2","MEINPROGRAMM2", (char *) 0);
    


  • asha schrieb:

    Du willst nicht execle sondern execlp benutzen. Oder genauer gesagt:

    int rc=execle("/home/alex/entw/MEINPROGRAMM2","MEINPROGRAMM2", (char *) 0);
    

    Natürlich Käse sondern:

    int rc=execlp("/home/alex/entw/MEINPROGRAMM2","MEINPROGRAMM2", (char *) 0);
    

    Gruß



  • hallo asha,

    danke ...werd es gleich mal checken ...

    Gruss Alex 🕶 δ



  • ne, execl ist schon richtig. execlp geht ja ähnlich wie die Shell vor und durchsucht die PATH-Variable, aber er gibt ja eh einen absoluten Pfad an.



  • Hallo,

    das Programm funktioniert perfekt, aber jedesmal wenn ich das Child kille, habe ich einen Zombie-Prozess, ich weiss, das Ding ist tot und belegt nur eine ProzessID, aber ich empfinde das als unschön 👎 *lach*
    Ich habe mal gegoogelt und das gefunden:

    Nun, der Prozeß moechte seinem Parent noch den Exit-Status übergeben. Damit der Parent auch weiß, welches Kind ihm diesen Status schickt, muß der Prozeß seine Prozessnummer behalten, bis der Parent den Status gelesen hat.

    Wenn der Parent aber ein Rabenvater ist und die letzten Worte seines Kinds nicht hören möchte, dann geistert der tote Prozeß als Zombie weiter durch das System, solange bis er den Exit-Status doch noch bei seinem Parent abliefern kann.

    Wie kann ich das Realisieren , das mein Programm kein Rabenvater ist und den Exit-Status abfragen kann, das der Kindeszombie weg ist? 😕

    Danke für Eure Hilfe

    Gruss ALex 🙂





  • Danke, werd ich gleich mal checken.
    Mir ist bloss mein Entwicklungsserver gestorben 👎

    Danke für die Hilfe

    Gruss ALex 🙂


Anmelden zum Antworten