Signatur
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
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";
}
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);
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
}
// 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.