pid mittels einfachem Code herrausbekommen?

Dieses Thema im Forum "C/C++" wurde erstellt von Yellow, 02.07.2007.

  1. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Hi...

    ich möchte gerne die PID eines Programmes herausbekommen in dem ich nur den Namen des Prozesses eingebe und nicht etwas die GROUP oder USER ID etc.

    Also um genau zu sein, möchte ich nur den Namen eingeben und dann NUR die PID als Resultat herraus bekommen!

    Doch wie bewerkstellige ich das? Habe Linux noch nicht lange und kenne mich von daher noch nicht so gut damit aus!



    Yellow
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    Hallo
    Schau dir mal 'pgrep' an, man pgrep
    Gruss
    d22
     
  4. towo

    towo Haudegen

    Dabei seit:
    16.05.2003
    Beiträge:
    649
    Zustimmungen:
    1
    Ort:
    Pößneck
    pidof
     
  5. #4 Lord Kefir, 02.07.2007
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Bei solchen Sachen ist das /proc-Verzeichnis immer super!

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <dirent.h>
    #include <regex.h>
    #include <string.h>
    
    void
    list_process_ids (const char *name) {
    	DIR *dir;
    	struct dirent *dir_info;
     	regex_t preq;
    	char filename[64], buffer[256];
    	FILE *fz;
    	int len, count = 0;
    
    	/* reguläre Ausdrücke kompilieren */
    	regcomp (&preq, "^[[:digit:]]+$", REG_EXTENDED);
    
    	/* /proc-Verzeichnis öffnen */
    	if (dir = opendir ("/proc")) {
    		/* alle Process-Statusdateien öffnen & den Prozessnamen ermitteln */
    		while ((dir_info = readdir (dir))) {
    			if (!regexec (&preq, dir_info->d_name, 0, NULL, 0)) {
    				memset (filename, 0, 64);
    				sprintf (filename, "/proc/%s/status", dir_info->d_name);
    
    				if ((fz = fopen (filename, "r"))) {
    					/* erste Zeile der Datei einlesen und Namen prüfen */
    					memset (buffer, 0, 256);
     					if ((fgets (buffer, 256, fz))) {
    						len = strlen (buffer);
    						buffer[len - 1] = '\0';
    						if (!strcmp (buffer + 6, name)) {
    							fprintf (stdout, "pid: %s\n", dir_info->d_name);
    							++count;
    						}
     					}
    
    					/* Datei schließen */
    					fclose (fz);
    				}
    			}
    		}
    
    		/* Verzeichnis schließen */
    		closedir (dir);
    	
    		if (!count) {
    			fprintf (stdout, "No entries.\n\n");
    		}
    		else {
    			fprintf (stdout, "\n");
    		}
    	}
    	else {
    		fprintf (stderr, "Couldn't open /proc\n\n");
    	}
    
    	/* Speicher bereinigen */
    	regfree (&preq);
    }
    
    int
    main (int argc, char *argv[]) {
    	if (argc != 2) {
    		fprintf (stderr, "USAGE: %s [process]\n\n", argv[0]);
    		return EXIT_FAILURE;
    	}
    
    	list_process_ids (argv[1]);
    	
    	return EXIT_SUCCESS;
    }
    
    Gruß,
    Lord Kefir
     
  6. #5 Yellow, 05.07.2007
    Zuletzt bearbeitet: 19.07.2007
    Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Ich danke euch für eure vielen Antworten. Ich werde mich mit jeder Antwort zuhause an meinem Rechner beschäftigen!

    Also thx erstmal

    Yellow
     
  7. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Hi Leute!

    Ich habe mir mal den Code von Lord Kefir angeschaut und natürlich auch die Commands von den anderen. Und ich habe mir mal einen eigenen Code geschrieben der auch Funktioniert. Doch jetzt wüste ich gerne mit welchem Code ich ehr auf der Sicherenseite stehe. Denn ich finde den Code von Lord Kefir etwas umständlich. Doch ich kann mich auch irren und meiner ist Newbie mist ;)

    Würde mich über eure Meinungen sehr freuen!
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 255
    
    int
    main(void) {
         FILE *file; // TEMP-FILE
         char pname[MAX], bastel[MAX], command[MAX], zeile[10];
    
         printf("Prozess: ");
         fgets(pname,MAX,stdin);
    
         if(NULL == pname) {
              fprintf(stderr,"Fehler: Kein Prozess angegeben!\n");
              return (EXIT_FAILURE);
         }
    
         strtok(pname,"\n");
         strcpy(command,"pgrep "); // geht auch pidof!
         strcpy(bastel," > pid.txt");
         strncat(pname,bastel,sizeof(bastel));
         strncat(command,pname,sizeof(pname));
    
         system(command); // Gibt es es eine Alternative zu "system()" ?
    
         if( (file=fopen("pid.txt","r")) == NULL)
              fprintf(stderr,"Fehler: Datei konnte nicht gelesen werden!\n");
    
         while(fgets(zeile,sizeof(zeile),file))
              fputs(zeile,stdout);
    
         remove("pid.txt");
         fclose(file);
    
         return (EXIT_SUCCESS);
    }
    
    greez Yellow
     
  8. #7 Lord Kefir, 30.07.2007
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Hallo Yellow,

    meiner Ansicht nach ist der Start von externen Programmen grundsätzlich das letzte was man zur Lösung eines Problems machen sollte - zumindest wenn der Code nicht für einen rein privaten Zweck ist. Und sollte dies der Fall sein, kann man sich auch gleich ein Bash-Script zusammenbasteln bevor man zum Compiler greift ;)

    Du kannst ja mal aus Spaß ein kleines Script in Deinem Programmordner erstellen:

    Code:
    #!/bin/sh
    echo "Hallo Welt"
    
    Benenne die Datei "pgrep" und führe folgende Zeilen aus:

    Code:
    chmod u+x ./pgrep
    SET PATH=`pwd`
    
    Wenn Du jetzt Dein Programm ausführst sollte es als Prozess-ID "Hallo Welt" ausgeben. Das macht jetzt nicht wirklich Sinn. Aber Du kannst Dir sicherlich vorstellen, dass so etwas von Seiten der Sicherheit total daneben ist.

    Ferner führt system() ja auch nur ein Programm mit der definerten Shell aus. So gesehen hast Du noch nicht einmal eine Garantie dafür, ob das "pipen" so funktioniert wie es soll.
    Und was erklärst Du dem Benutzer wenn er bereits eine Datei namens "pid.txt" hatte, welche durch Dein Programm gelöscht wird? Die Vorraussetzung ist dafür wiederum, dass Du überhaupt Schreibrechte hast - so etwas würde ich vorher lieber prüfen. Es gibt extra Funktionen zum Erstellen temporärer Dateinamen.

    Der Weg über die Datei ist davon abgesehen total überflüssig. Wenn Du schon ein externes Programm ausführst, dann würde ich lieber popen() benutzen.

    Nebenbei noch ein paar kleinere Tipps:
    - return ist ein Makro - Klammern sind demnach unüblich.
    - Ich würde Dateien nur schließen, wenn sie auch geöffnet worden sind.
    - Das sizeof() bei strncat() ist falsch.
    - strtok() kann gefährlich sein. Dein Programm kann davon abgesehen auch ohne "Enter" gestartet werden.


    Gruß,

    Lord Kefir
     
  9. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Also erstmal THX Lord Kefir für deine Analyse meines zusammen geschusterten Codes. Doch für mich als Anfänger war das schon mal ein Erfolgserlebniss. Doch hast du recht. Wenn es um Korrektes Programmieren geht, bin ich noch weit davon entfehrnt.

    Die Funktion "popen()" wird in meinem Lehrbuch nicht beschrieben. Von daher konnte ich diese Funktion nicht kennen :) . Und das mit der Temporären Datei erstellen habe ich bis dato aus dem Buch noch nicht so ganz begriffen. Wie gesagt: "lerne noch!". :baby:

    Was mich dazu aber dann wirklich interessiert ist: Gibt es eine Ersatzfunktion für "system()" ???
     
  10. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  11. #9 Lord Kefir, 02.08.2007
    Lord Kefir

    Lord Kefir König

    Dabei seit:
    10.06.2004
    Beiträge:
    944
    Zustimmungen:
    0
    Hi Yellow,

    popen() ist AFAIK auch nicht ANSI-Standard (allerdings POSIX). Kannst Dir ja mal die manpage anschauen. Das schöne ist das popen() wie fopen() eine FILE-Variable zurückgibt. Du könntest also ein Programm ausführen und die Rückgabe wie eine Datei auslesen.

    Code:
    [...]
    
    FILE *fz;
    
    if ((fz = fopen ("ps aux", "r"))) {
         while (fread (buffer, 512, sizeof (char), fz)) {
              [...]
         }
    
         pclose (fz);
    }
    
    
    [...]
    
    Wie bereits erwähnt, ich würde zum ausführen von externen Programme zu popen() greifen :)



    Gruß,

    Lord Kefir
     
  12. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Guten Morgen Lord Kefir!

    Hey das ist ja mal eine Coole Funktion das popen(). Die werde ich mir gleich irgendwo in eine Speicherlücke in meinem Gehirn raussuchen und die Funktion reinschieben :D

    Thx
     
Thema: pid mittels einfachem Code herrausbekommen?
Besucher kamen mit folgenden Suchen
  1. pid ermitteln linux

    ,
  2. linux c pid ermitteln

    ,
  3. raspberry pi script prozess id auslesen

Die Seite wird geladen...

pid mittels einfachem Code herrausbekommen? - Ähnliche Themen

  1. Bräuchte Hilfe bei Backupscript mittels Bash und cronjob

    Bräuchte Hilfe bei Backupscript mittels Bash und cronjob: Es soll für bestimmte Ordner Archivierung aller Dateien(Logfiles), die älter als 30 Tage sind machen. Am besten einmal täglich nachts irgendwann....
  2. rpm mittels yum

    rpm mittels yum: Hallo Wir haben folgendes System: Red Hat Enterprise Linux Server release 5.1 (Tikanga) (32 Bit - i686) Gerne würde ich darauf dieses...
  3. Wie einen Pfad zur Vereinfachung mittels Shellskript wechseln

    Wie einen Pfad zur Vereinfachung mittels Shellskript wechseln: Ich muß häufiger in 2 bestimmte Verzeichnisse auf 3. oder 4. Ebene wechseln. Um nicht permanent cd /ordnerA/ordnerB/ordnerC... usw eingeben zu...
  4. Leerzeichen, Großbuchstaben, HTML Tags entfernen mittels SED

    Leerzeichen, Großbuchstaben, HTML Tags entfernen mittels SED: Hallo zusammen. Ich habe folgendes Anliegen: Ich habe eine HTML Datei mit entsprechenden Tags usw. . Diese möchte ich in eine normale Textdatei...
  5. pdf mittels script öffnen und script dabei weiter ausführen

    pdf mittels script öffnen und script dabei weiter ausführen: Hallo, ich öffne in einen bash Skript eine PDF mit: acroread /.../.../file.pdf Ghet es auch, dass das Skript nach dem öffnen des PDFs weiter...