std.process_ext

Prozess-Credentials & Systeminfo (WP-7): Liest und setzt User-/Group-IDs, ermittelt Prozessbeziehungen (PPID, PGRP) und verwaltet Sessions. Liefert außerdem Kernel- und Systeminformationen via uname (Hostname, Kernel-Version, Architektur).

Standard Library · std.process · std.signals


Konstanten

utsname-Puffer

Konstante Wert Beschreibung
UTSNAME_SIZE 390 Gesamtgröße des utsname-Puffers (6 × 65 Bytes)
UTSNAME_FIELD_LEN 65 Länge eines einzelnen Feldes inkl. Null-Byte
UTSNAME_SYSNAME 0 Offset: Betriebssystemname (z. B. „Linux„)
UTSNAME_NODENAME 65 Offset: Hostname des Rechners
UTSNAME_RELEASE 130 Offset: Kernel-Release (z. B. „6.8.0-117-generic“)
UTSNAME_VERSION 195 Offset: Kernel-Build-Info
UTSNAME_MACHINE 260 Offset: CPU-Architektur (z. B. „x86_64„)
UTSNAME_DOMAIN 325 Offset: NIS-Domain-Name

Funktionen

Credentials lesen

Signatur Beschreibung
GetUID(): int64 Reale User-ID des Prozesses
GetGID(): int64 Reale Group-ID des Prozesses
GetEUID(): int64 Effektive User-ID (relevant für Berechtigungsprüfungen)
GetEGID(): int64 Effektive Group-ID
GetPPID(): int64 PID des Elternprozesses
GetPGRP(): int64 Prozessgruppen-ID des aktuellen Prozesses
IsRoot(): bool Gibt true zurück wenn die effektive UID 0 ist (Root)

Credentials setzen

Signatur Beschreibung
SetUID(uid: int64): int64 Setzt die User-ID. Gibt 0 bei Erfolg, -EPERM wenn keine Berechtigung
SetGID(gid: int64): int64 Setzt die Group-ID. Gibt 0 bei Erfolg, -EPERM wenn keine Berechtigung

Session & Prozessgruppe

Signatur Beschreibung
SetSID(): int64 Erstellt eine neue Session (Daemon-Grundlage). Gibt die neue SID zurück. Schlägt fehl wenn der Prozess bereits Prozessgruppen-Leader ist
SetPGID(pid: int64, pgid: int64): int64 Setzt die Prozessgruppe von pid auf pgid. pid=0 → aktueller Prozess; pgid=0pid wird eigene Prozessgruppe

Systeminfo (uname)

Signatur Beschreibung
GetUname(buf: int64): int64 Füllt buf (alloc(UTSNAME_SIZE)) mit dem vollständigen utsname-Struct. Gibt 0 bei Erfolg
GetUnameSysname(outBuf: int64): int64 Kopiert das sysname-Feld nach outBuf (min. UTSNAME_FIELD_LEN Bytes)
GetUnameNodename(outBuf: int64): int64 Kopiert den Hostnamen nach outBuf
GetUnameRelease(outBuf: int64): int64 Kopiert die Kernel-Version (z. B. „6.8.0-117-generic“) nach outBuf
GetUnameVersion(outBuf: int64): int64 Kopiert die Kernel-Build-Info nach outBuf
GetUnameMachine(outBuf: int64): int64 Kopiert die CPU-Architektur (z. B. „x86_64„) nach outBuf

Verwendung

Credentials prüfen und wechseln (setuid-Daemon)

import std.process_ext;
import std.io;

fn DropPrivileges(targetUid: int64, targetGid: int64): bool {
    if (!IsRoot()) {
        PrintLn("Warnung: läuft nicht als Root");
        return false;
    }

    // GID zuerst setzen (danach fehlt Root-Recht für SetGID)
    if (SetGID(targetGid) < 0) { return false; }
    if (SetUID(targetUid) < 0) { return false; }

    PrintLn("Privileges abgegeben. EUID=" + IntToStr(GetEUID()));
    return true;
}

Daemon erstellen (fork + setsid)

import std.process_ext;
import std.process;

fn Daemonize(): void {
    var pid := Fork();
    if (pid > 0) {
        // Elternprozess beenden
        Exit(0);
    }

    // Kindprozess: neue Session starten
    SetSID();

    // Zweiter fork verhindert, dass der Daemon ein Controlling Terminal bekommt
    pid := Fork();
    if (pid > 0) { Exit(0); }

    // Ab hier: echter Daemon-Prozess ohne Terminal
}

Kernel-Info ausgeben

import std.process_ext;
import std.alloc;
import std.io;

fn PrintSystemInfo(): void {
    var buf: int64 := alloc(UTSNAME_FIELD_LEN);

    GetUnameNodename(buf);
    PrintLn("Hostname:       " + buf as pchar);

    GetUnameRelease(buf);
    PrintLn("Kernel-Version: " + buf as pchar);

    GetUnameMachine(buf);
    PrintLn("Architektur:    " + buf as pchar);

    free(buf, UTSNAME_FIELD_LEN);
}

Prozessbeziehungen

import std.process_ext;
import std.io;

fn PrintProcessIds(): void {
    Print("UID=" + IntToStr(GetUID()));
    Print(" GID=" + IntToStr(GetGID()));
    Print(" EUID=" + IntToStr(GetEUID()));
    Print(" PPID=" + IntToStr(GetPPID()));
    PrintLn(" PGRP=" + IntToStr(GetPGRP()));
}


Hinweise

  • SetUID und SetGID erfordern Root-Rechte oder das CAP_SETUID/CAP_SETGID-Capability. Ohne Root kann ein Prozess seine UID nur auf seine eigene reale oder gespeicherte UID setzen.
  • Bei SetSID muss der aufrufende Prozess ein Kindprozess sein (nach fork), der noch kein Prozessgruppen-Leader ist.
  • Alle GetUname*-Funktionen rufen intern sys_uname auf und allozieren temporär 390 Bytes — für mehrere Felder ist GetUname mit einem eigenen Puffer effizienter.
  • UTSNAME_FIELD_LEN = 65: Die Felder sind null-terminiert, maximal 64 Nutzzeichen.

Verwandte Units

  • std.process — fork, exec, waitpid, exit
  • std.signals — Signalbehandlung (Signal-Maske gilt pro Prozess/Thread)
  • std.sched — CPU-Affinität und Scheduling-Priorität
  • std.os — Allgemeine OS-Hilfsfunktionen

Letzte Aktualisierung: 2026-06-05