Process ID anhand des Namen



  • Hallo.
    Gibt es eine möglichkeit die ID eines Prozesses heraus du finden wenn nur der Name dieses Prozesses bekannt ist?



  • Hallo,

    ja, z. B.:

    ps -ef | grep bash
    


  • Ich habe mich nicht preziese ausgedrückt.
    Mir geht es darum wie man das in einem C-Quellencode machen könnte und nicht in der konsole.Trozdem danke.



  • Tja, so ad hoc wüsst ich das auch nicht. Ich habe mir eben noch pgrep angeguckt, was im Grunde genau das macht. Vielleicht hilft dir ja evtl. der Quellcode? Es wird aber wahrscheinlich nix anderes machen, als sich die Informationen aus dem /proc Verzeichnis rauszuholen.



  • Ich glaub wir hatten mal so ein ähnliches Problem weiter unten. Einer wollte ``ps" nachprogrammieren, und wir sind zu dem Schluß gekommen, dass dies sich nicht auf portablen Weg bewerkstelligen lässt. ``ps" geht glaub ich das ``/proc fs" ab und öffnet dort das file cmdline (oder so ähnlich) welches dann argv[0] entspricht.

    mfg

    PS: Ich lass mich gerne vom Gegenteil überzeugen



  • Also jeder Process bekomm sein eigenes Verzeichniss in /proc/*n *n=Porcess ID, wenn du nun einfach alle nummerischen verzeichnisse in /proc öffnest und dort in der Datei status schaust steh an erstes stelle der name des Processes. Das sollte ja eigentlich reichen, von der geschwindikeit is vieleicht nicht die schnellste aber langsam is es auch nicht, da das Verzeichnis /proc kein realles verzeichnis is sondern nur eine Abbildung des kernels. Wenn du es etwas professioneller machen möchtest, kann man unter c/c++ zu jedem Process eine ganze reihe von Informationen herrausfinden, z.b die Namen des Kindprocesses und so weiter, wenn du nun die Informationen von init Process (Der Vater aller Processe) stehen dort alle Informationen. Ich schau mir das mal genauer an und geb dir nen Code Beispiel.



  • Für jeden Process der gerade abläuft, bnefindet sich ein Eintrag in der sogenannten Processtabelle, die in der headerdatei linux/sched.h deklrariert ist.

    mit extern struct task_struct *task[NR_TASKS];
    dann kannst ud mit hilfe der verketteten liste von einem zum anderen Process springen und so die Namen und PID herrausfinden.



  • Hallo.
    @Klimpelb

    Also ich habe folgendes Problem. Ich starte mit system(..) ein programm und will über wachen ob das Programm noch läuft.
    zu beispiel so:

    #include <stdio.h>
    #include <unistd.h>
    
    system(mein_programm)
    while(dasprogrammläuft()==1)
    {
      sleep(10)
    }
    

    professioneller machen möchtest, kann man unter c/c++

    Also ich möchte es so sauber wie möglich machen am besten mit irgend welchen C/C++ funktionen.
    Ich hoffe ich habe mein Problemm gut geschildert.



  • Statt system kannst du fork()en (da erhältst du gleich die neue PID) und dann mit exec* das Programm aufrufen.



  • Ok ich bin schon ein Schritt weiter aber...

    extern struct task_struct *task[NR_TASKS];
    dann kannst ud mit hilfe der verketteten liste von einem zum anderen Process springen

    Ich habe alles mögliche durchgesucht aber ich komme einfach nicht darauf wie ich die task_struct struktur mit daten des eigenen prozesses füllen kann bzw den wie bekomme ich den zeiger auf diese struktur die eigentlich, da der prozess schon läuft, egsistieren muss. In der leeren Struktur zeigen *next_task und *prev_task ja auf nicht vernüftiges.
    Wo ist dieser Zeiger also???



  • wieso möchtest du wissen ob das Programm noch läuft?



  • @Unix-Tom
    Weil ich mein programm anhalten will wenn das andere programm ausgeführt wird.



  • Statt system kannst du fork()en (da erhältst du gleich die neue PID) und dann mit exec* das Programm aufrufen.

    int start_prog_wait(const char * s)
    {
        pid_t pid = fork();
    
        if (pid == -1)
            return (-errno);
        if (pid == 0) {
            if (execlp(s, s, (char *) 0) == -1)
                return (-errno);
        }
        if (waitpid(pid, NULL, 0) == -1)
            return (-errno);
        }
        return (0);
    }
    
    int main(void)
    {
        char str[64];
        int err;
    
        gets(str); // <-- nicht nachmachen
        if ( (err = start_and_wait(str)) != 0) {
            fputs(strerror(-err), stderr); 
        }
        return (0);
    }
    

    mfg



  • Hallo Alle.
    Erst mal Danke für die vielen Antworten.
    Also noch wie vor kann ich mein Problemm nicht so lösen wie ich das gerne hätte.
    Die einzige Lösung die auf die ich jetzt (dank euer Hilfe) gekommen bin ist einfach das Verzeichnis /proc ständig auszuwerten und in status Datei nach dem Prozessnammen zu suchen.

    Der Lösung mit task_struct wäre genau das richtige wenn:
    1. ich nur wüsste wie ich an den zeiger auf diese Struktur herankomme
    2. wo sich in dieser Struktur der namme des Prozesses befindet
    Die funktion:

    struct task_struct *find_task_by_pid(int pid)
    

    die das richtige zu sein scheint funktioniert leider mit #include<sched.h> nicht (linkerfehler), und mit #include <linux/sched.h> bekomme ich so viele Fehlermeldungen daß mir schwindlig wird.

    @unixer
    folk() und exec(..) bringen leider nichts, das ergebnis ist das gleiche wie bei System(..)
    Versuch mit deinem code kbear zu starten.Das Programm wartet nicht obwohl kbear läuft.
    @DrGreenthumb
    pid des eignen Prozesses ist kein Problemm, man kann sie mit getpid() ermitteln.



  • pid des eignen Prozesses ist kein Problemm, man kann sie mit getpid() ermitteln.

    nein, du erhälst von dem fork() Aufruf, die PID des neuen Prozesses. Es könnte sein, dass KBear sich selbst nochmal in den Hintergrund forkt. Dann gibts vielleicht einen Parameter, der dass verhindert.

    Diese Linux-Interne Struktur ist nicht gut. Wie du selbst feststellst, undokumentiert. Und selbst wenn du es zum Laufen bekommst, kanns passieren dass es in der nächsten Kernelversion schon nicht mehr funktioniert. Dann lieber die POSIX-Variante.


Anmelden zum Antworten