Start · Sprachen · PHP · Referenz · posix_mknod

posix_mknod

Funktion

Erzeugt eine spezielle oder gewöhnliche Datei gemäß POSIX.1, z. B. eine reguläre Datei, ein Verzeichnis, eine FIFO oder eine Gerätedatei.

seit PHP 5.1.0 Kategorie: misc

Signatur

posix_mknod(string $filename, int $flags, int $major = 0, int $minor = 0): bool

Beschreibung

posix_mknod() ist die PHP-Schnittstelle zum POSIX-Systemaufruf mknod(2). Mit ihr lassen sich verschiedene Dateitypen direkt auf Betriebssystemebene anlegen: reguläre Dateien (POSIX_S_IFREG), Verzeichnisse (POSIX_S_IFDIR), Named Pipes/FIFOs (POSIX_S_IFIFO), symbolische Links (POSIX_S_IFLNK) sowie Block- und Zeichengerätedateien (POSIX_S_IFBLK bzw. POSIX_S_IFCHR).

Der Parameter flags wird durch eine bitweise ODER-Verknüpfung des gewünschten Dateityps mit optionalen Zugriffsrechten (z. B. 0644) angegeben. Für Block- und Zeichengerätedateien müssen zusätzlich die Parameter major (Haupt-Gerätenummer) und minor (Neben-Gerätenummer) angegeben werden.

Die Funktion ist besonders nützlich bei Systemadministrationsaufgaben, beim Erstellen von FIFOs für Interprozesskommunikation oder bei der Low-Level-Geräteverwaltung unter Linux/Unix. Sie steht ausschließlich auf POSIX-kompatiblen Betriebssystemen zur Verfügung und ist unter Windows nicht nutzbar.

Das Anlegen von Gerätedateien (POSIX_S_IFBLK, POSIX_S_IFCHR) erfordert in der Regel Root-Rechte (UID 0). Das Erstellen von FIFOs und regulären Dateien ist hingegen auch als normaler Benutzer möglich, sofern die Verzeichnisrechte es erlauben.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Der Pfad zur zu erstellenden Datei oder zum Gerät. Darf noch nicht existieren.
$flags Pflicht int Bitmask aus einem der Dateityp-Konstanten (POSIX_S_IFREG, POSIX_S_IFDIR, POSIX_S_IFIFO, POSIX_S_IFLNK, POSIX_S_IFBLK, POSIX_S_IFCHR) kombiniert per bitweisem ODER mit den gewünschten Zugriffsrechten (z. B. 0644).
$major int 0 Haupt-Gerätenummer (major device number). Wird nur für Block- und Zeichengerätedateien (POSIX_S_IFBLK, POSIX_S_IFCHR) benötigt.
$minor int 0 Neben-Gerätenummer (minor device number). Wird nur für Block- und Zeichengerätedateien (POSIX_S_IFBLK, POSIX_S_IFCHR) benötigt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Datei erfolgreich angelegt wurde, andernfalls false. Bei einem Fehler kann mit posix_get_last_error() und posix_strerror() der genaue Fehlergrund ermittelt werden.

Beispiele

FIFO (Named Pipe) erstellen

<?php
// Eine FIFO-Datei für Interprozesskommunikation anlegen
$fifoPath = '/tmp/meine_fifo';

if (posix_mknod($fifoPath, POSIX_S_IFIFO | 0600)) {
    echo "FIFO erfolgreich erstellt: $fifoPath\n";
} else {
    $errno = posix_get_last_error();
    echo "Fehler: " . posix_strerror($errno) . "\n";
}
FIFO erfolgreich erstellt: /tmp/meine_fifo

Reguläre Datei mit posix_mknod erstellen

<?php
// Eine leere reguläre Datei anlegen (ähnlich wie touch())
$filePath = '/tmp/meine_neue_datei.txt';

if (posix_mknod($filePath, POSIX_S_IFREG | 0644)) {
    echo "Datei erfolgreich erstellt.\n";
    echo "Typ: " . filetype($filePath) . "\n";
} else {
    $errno = posix_get_last_error();
    echo "Fehler (" . $errno . "): " . posix_strerror($errno) . "\n";
}

// Aufräumen
unlink($filePath);
Datei erfolgreich erstellt. Typ: file

Zeichengerätedatei erstellen (erfordert Root)

<?php
// Zeichengerätedatei für /dev/null nachbilden (major=1, minor=3 unter Linux)
// Benötigt Root-Rechte!
$devPath = '/tmp/mein_null_device';

$result = posix_mknod($devPath, POSIX_S_IFCHR | 0666, 1, 3);

if ($result) {
    echo "Zeichengerät erfolgreich erstellt.\n";
} else {
    $errno = posix_get_last_error();
    echo "Fehler (" . $errno . "): " . posix_strerror($errno) . "\n";
    // Ohne Root: Fehler (1): Operation not permitted
}
Fehler (1): Operation not permitted

// Wichtig · Fallstricke

Plattformabhängigkeit: posix_mknod() steht nur auf POSIX-kompatiblen Systemen (Linux, macOS, BSD) zur Verfügung. Unter Windows ist die Funktion nicht verfügbar. Das POSIX-Erweiterungsmodul muss aktiviert sein.

Rechte: Das Erstellen von Gerätedateien (POSIX_S_IFBLK, POSIX_S_IFCHR) erfordert Root-Rechte. In produktiven Web-Umgebungen sollte diese Funktion daher mit äußerster Vorsicht eingesetzt werden, da sie potenziell sicherheitskritisch ist.

Umask: Die tatsächlichen Dateiberechtigungen werden durch die aktuelle Umask des Prozesses beeinflusst. Mit umask(0) kann die Umask temporär deaktiviert werden, um die exakten angegebenen Rechte zu setzen.

Fehlerbehandlung: Bei einem Fehler gibt die Funktion false zurück. Der genaue Fehlercode kann mit posix_get_last_error() und eine lesbare Beschreibung mit posix_strerror() abgerufen werden.