(PHP 4 >= 4.2.0, PHP 5 <= 5.0.5)
dio_fcntl — Modifiziert einen Dateideskriptor
Die Funktion dio_fcntl() führt die mit
cmd
festgelegte Operation auf dem
Dateideskriptor fd
aus. Für einige
dieser Operationen müssen zusätzliche Argumente im
Parameter args
übergeben werden.
fd
Ein von dio_open() zurückgegebener Dateideskriptor.
cmd
Eine der folgenden Operationen:
F_SETLK
- Setzt oder löscht eine
Dateisperre. Wenn diese Sperre bereits von jemand anderem
gehalten wird, gibt dio_fcntl() -1
zurück.
F_SETLKW
- ähnlich F_SETLK
,
hier wird aber in dem Fall, dass bereits jemand anderes die Sperre
hält, gewartet bis diese wieder freigegeben wird.
F_GETLK
- dio_fcntl()
gibt ein assoziatives Array mit Informationen (wie weiter unten
beschrieben) zurück, wenn jemand anderes bereits eine Sperre hält.
Existiert keine andere Sperre, wird das Element "type" auf
F_UNLCK
gesetzt.
F_DUPFD
-
Findet den kleinsten verfügbaren Dateideskriptor >=
args
und gibt diesen zurück.
F_SETFL
-
Setzt die Flags des Dateideskriptors auf den in
args
angegebenen Wert. Die verfügbaren Flags
sind O_APPEND
, O_NONBLOCK
und O_ASYNC
. Um O_ASYNC
setzen zu können, benötigen Sie die
PCNTL-Extension.
args
Die cmd
-Operationen F_SETLK
und F_SETLLW
erwarten ein Array mit den folgenden
Elementen:
"start" - Offset an dem die Sperre beginnt
"length" - Länge des gesperrten Bereichs, 0 bedeutet dabei "bis zum Dateiende"
"wenth" - Die Position, auf die sich start
bezieht, dabei steht SEEK_SET
für den
Dateianfang, SEEK_END
für das Dateiende und
SEEK_CUR
für die aktuelle
Schreib-/Leseposition.
"type" - Art der Sperre: F_RDLCK
(Lesesperre),
F_WRLCK
(Schreibsperre) oder
F_UNLCK
(Sperre aufheben)
Gibt das Ergebnis des entsprechenden C-Aufrufs zurück.
Beispiel #1 Setzen und Löschen einer Sperre
<?php
$fd = dio_open('/dev/ttyS0', O_RDWR);
if (dio_fcntl($fd, F_SETLK, Array("type"=>F_WRLCK)) == -1) {
// Die Datei ist anscheinend schon anderweitig gesperrt
echo "Sperrung fehlgeschlagen, die Datei wird schon von jemand anderem gesperrt.";
} else {
echo "Sperrung erfolgreich durchgeführt";
}
dio_close($fd);
?>
Hinweis: Diese Funktion ist auf Windows-Plattformen nicht implementiert.