7.7 Prozesserkennung
Zum Ermitteln der eigenen Prozess-ID (PID) oder der ID des Prozesses (Elternprozess), der den Start veranlasst hat, stehen Ihnen die Funktionen getpid() und getppid() zur Verfügung. Wird die reale oder effektive User-ID benötigt, kann dies mit getuid() und geteuid() erfragt werden. Für reale oder effektive Gruppen-IDs sind die Funktionen getgid() und getegid() vorhanden.
#include <sys/types.h>
#include <unistd. h.>
pid_t getpid(void);
pid_t getppid(void);
pid_t getuid(void);
pid_t geteuid(void);
pid_t getgid(void);
pid_t getegid(void);
Das folgende Beispiel demonstriert Ihnen, wie Sie all diese Prozesskenndaten ausgeben können.
/* proz_dat.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd. h.>
#include <sys/types.h>
int main( void ) {
printf("Ich bin Nummer %d\n", getpid());
printf("Mein Elternprozess hat die Nummer %d\n",
getppid());
printf("Die User-ID effektiv : %d --> real: %d\n",
geteuid(),getuid());
printf("Die Group-ID effektiv: %d --> real: %d\n",
getegid(),getgid());
return EXIT_SUCCESS;
}
Das Programm bei der Ausführung:
$ gcc -o proz_dat proz_dat.c
$ ./proz_dat
Ich bin Nummer 3186
Mein Elternprozess hat die Nummer 1952
Die User-ID effektiv : 500 --> real: 500
Die Group-ID effektiv: 100 --> real: 100
Wollen/müssen Sie die realen und effektiven User- und Group-IDs verändern, können Sie folgende Funktionen verwenden:
#include <unistd. h.>
#include <sys/types.h>
int setuid(uid_t uid);
int setgid(gid_t gid);
setuid() bzw. setgid() setzen die effektive User- bzw. Gruppen-ID des aktuellen Prozesses. Wird diese Funktion durch den Superuser aufgerufen, dann werden auch die reale und die gesicherte (Saved Set-User-ID) User- bzw. Gruppen-ID gesetzt.
Unter Linux ist setuid() bzw. setgid(), wie unter SYSV, mit SAVED_IDS implementiert. Dies erlaubt einem setuid()- bzw. setgid()-Programm (für Nicht-Superuser), alle Gruppenprivilegien abzugeben, einige nicht privilegierte Arbeiten zu erledigen und dann, auf sichere Art und Weise, die originale effektive User- bzw. Gruppen-ID zurückzuerhalten.
Wenn es sich um den Superuser oder um ein Programm handelt, bei dem das Set-UID-Bit bzw. das Set-GID-Bit auf root gesetzt ist, ist besondere Sorgfalt notwendig. Die setuid()- bzw. setgid()-Funktion überprüft die effektive UID bzw. GID des aufrufenden Prozesses, und wenn es die des Superusers ist, werden alle diesen Prozess betreffenden User- bzw. Gruppen-IDs auf uid bzw. gid gesetzt. Nachdem dies geschehen ist, ist es für das Programm unmöglich, wieder Superuser-Privilegien zu erhalten.
Bei Erfolg wird 0, ansonsten bei einem Fehler -1 zurückgegeben. errno wird bei einem entsprechenden Wert (meistens EPERM) gesetzt.
|