pid mittels einfachem Code herrausbekommen?

Yellow

Yellow

Doppel-As
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
 
Hallo
Schau dir mal 'pgrep' an, man pgrep
Gruss
d22
 
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
 
Ich danke euch für eure vielen Antworten. Ich werde mich mit jeder Antwort zuhause an meinem Rechner beschäftigen!

Also thx erstmal

Yellow
 
Zuletzt bearbeitet:
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
 
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
 
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()" ???
 
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
 
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
 

Ähnliche Themen

PIDs von Prozessen bestimmten Namens eines besteimmten Benutzers anzeigen

Samba 4.1.9 mit Bind 9.9.4

JBidWatcher: Problem bei loading Auctions in Verbindung mit mySQL

Alternative zu Ubuntu gesucht + Mängelliste

Debian squeeze, Webmin, Samba Freigaben

Zurück
Oben