Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

fcntl - offene Datei steuern

&pagelevel(4)&pagelevel

Definition

#include <fcntl.h>

Optional
#include <sys/types.h>
#include <unistd.h>(Ende)

int fcntl(int fildes, int cmd, ... /* arg */);

Beschreibung

fcntl() ermöglicht die Steuerung von offenen Dateien.

fildes ist ein Dateideskriptor einer offenen Datei.

An fcntl() kann ein drittes Argument übergeben werden, dessen Datentyp und Wert vom übergebenen Kommando cmd abhängen. cmd spezifiziert die Operation, die von fcntl() ausgeführt wird, und kann einer der folgenden Werte sein:

F_DUPFD

Ein neuer Dateideskriptor wird wie folgt zurückgegeben:

  • Dateideskriptor mit der niedrigsten verfügbaren Nummer, die größer als oder gleich dem ganzzahligen Wert ist, der als drittes Argument (arg)übergeben wird
  • dieselbe offene Datei (oder Pipe) wie die ursprüngliche Datei
  • derselbe Schreib-/Lesezeiger wie der der ursprünglichen Datei (d.h. beide Dateideskriptoren teilen sich denselben Schreib-/Lesezeiger)
  • derselbe Zugriffsmodus (Lesen, Schreiben oder Lesen/Schreiben) wie die ursprüngliche Datei
  • dieselben Dateistatus-Bits wie die ursprüngliche Datei
  • das Bit ’Schließen-bei-exec’ (siehe F_GETFD), das zum neuen Dateideskriptor gehört, so setzen, dass die Datei bei exec()-Aufrufen geöffnet bleibt

F_GETFD

ruft das Flag ’Schließen-bei-exec’ auf, das zu dem Dateideskriptor fildes gehört. Wenn das niederwertige Bit 0 ist, bleibt die Datei bei exec offen, andernfalls wird die Datei bei Aufruf von exec geschlossen.

F_SETFD

setzt das zu fildes gehörende Flag ’Schließen-bei-exec’ auf das niederwertige Bit des ganzzahligen Wertes, der als drittes Argument übergeben wird (0 oder 1 wie oben).

F_GETFL

ruft das Dateistatus-Flag für fildes ab.

F_SETFL

setzt das Dateistatus-Flag für fildes auf den ganzzahligen Wert, der als drittes Argument übergeben wird. Nur bestimmte Bits können gesetzt werden (siehe fcntl()).

Erweiterung

F_FREESP

gibt Speicherplatz, der mit einem Abschnitt der normalen fildes-Datei verbunden ist, frei. Dieser Abschnitt wird von einer Variablen des Datentyps struct flock, auf die das dritte Argument arg zeigt, spezifiziert. Der Datentyp struct flock ist in der Include-Datei fcntl.h definiert (siehe fcntl()) und beinhaltet folgende Mitglieder:

  • l_whence ist 0, 1 oder 2, um anzuzeigen, dass der relative Offset l_start vom Anfang der Datei, von der momentanen Position oder vom Ende der Datei gemessen wird.

  • l_start ist der Offset von der Position aus, die in l_whence spezifiziert wird. l_len ist die Länge dieses Abschnitts. Eine Länge von 0 gibt bis zum Ende der Datei alles frei; in diesem Fall wird das Ende der Datei auf den Anfang des freigegebenen Teils gesetzt. Auf die Daten, die vorher in diesen Teil geschrieben wurden, kann nicht mehr zugegriffen werden.(Ende)

Die folgenden Kommandos werden für Dateisperren und Datensatzsperren benutzt. Sperren können auf eine ganze Datei oder auf Segmente einer Datei gelegt werden.

F_SETLK

Eine Sperre in einem der Dateisegmente ist entsprechend der Variablen des Typs struct flock, auf die arg zeigt, zu setzen oder zu löschen (siehe fcntl()). Die Aktion F_SETLK wird zum Einrichten der Lesesperre (F_RDLCK) und der Schreibsperre (F_WRLCK) sowie für die Aufhebung beider Sperrtypen (F_UNLCK) verwendet. Lässt sich eine Lese- oder Schreibsperre nicht setzen, gibt fcntl() sofort den Fehlerwert -1 zurück.

F_SETLKW

Dieses cmd ist dasselbe wie F_SETLK, außer dass der Prozess schläft, bis das Segment frei zum Sperren ist, wenn die Sperranforderung durch andere Sperren blockiert wird.

F_GETLK

Wenn die durch die flock-Struktur angegebene Sperranforderung, auf die arg zeigt, erzeugt werden könnte, wird diese Struktur unverändert zurückgegeben, außer dass der Sperrtyp auf F_UNLCK und das Feld l_whence auf SEEK_SET gesetzt wird. Wird eine Sperre gefunden, die eine Erzeugung dieser Sperre verhindern würde, dann wird die Struktur mit der Beschreibung der ersten Sperre überschrieben.

Dieses Kommando erzeugt niemals eine Sperre; es testet nur, ob einzelne Sperren eingerichtet werden könnten.

F_RSETLK, F_RSETLKW, F_RGETLK


Diese Kommandos werden vom Netzwerkdämon lockd benutzt, um mit dem NFS-Server NFS-Dateien zu sperren.

Eine Lesesperre verhindert, dass ein Prozess den geschützten Bereich mit einer Schreibsperre belegen kann. Für ein bestimmtes Segment einer Datei kann zu einem Zeitpunkt mehr als eine Lesesperre vorhanden sein. Der Dateideskriptor, auf den die Lesesperre gesetzt wird, muss mit dem Leserecht geöffnet worden sein.

Eine Schreibsperre verhindert, dass ein Prozess den geschützten Bereich mit einer Schreib- oder einer Lesesperre belegt. Für ein bestimmtes Segment einer Datei kann zu einem gegebenen Zeitpunkt jeweils nur eine Schreib- oder Lesesperre vorliegen. Der Dateideskriptor, auf den eine Schreibsperre gesetzt wird, muss mit Schreibrecht geöffnet worden sein.

Die Struktur flock beschreibt Typ (l_type), Startpunkt-Offset (l_whence), relativen Offset (l_start), Größe (l_len), Prozessnummer (l_pid) und Systemnummer (l_sysid) des betroffenen Segments in der Datei.

Der Wert von l_whence ist entweder SEEK_SET, SEEK_CUR oder SEEK_END, je nachdem, ob der relative Offset l_start byte vom Anfang der Datei, der aktuellen Position oder dem Ende der Datei gerechnet wird. Der Wert von l_len entspricht der Anzahl der aufeinander folgenden Bytes, die gesperrt werden sollen. Der Wert von l_len kann negativ sein (wenn die Definition von off_t negative Werte für l_len zulässt). Das Feld l_pid wird nur für F_GETLK verwendet, um die Prozessnummer des Prozesses zurückzugeben, der eine blockierende Sperre enthält. Nach einer erfolgreichen F_GETLK-Anforderung, wenn also eine Sperre gefunden wurde, ist der Wert von l_whence SEEK_SET.

Wenn l_len positiv ist, beginnt der entsprechende Bereich bei l_start und endet bei l_start + l_len-1. Wenn l_len negativ ist, beginnt der entsprechende Bereich bei l_start + l_len und endet bei l_start-1. Sperren können jenseits des aktuellen Dateiendes beginnen und auch darüber hinausgehen, dürfen aber in Bezug auf den Dateianfang nicht negativ sein. Eine Sperre erstreckt sich auf den größtmöglichen Wert des Datei-Offsets für diese Datei, wenn l_len auf 0 gesetzt ist. Wenn für eine solche Sperre l_start auch auf 0 und l_whence auf SEEK_SET gesetzt ist, ist die gesamte Datei gesperrt.

Für jedes Byte der Datei wird maximal ein Sperren-Typ gesetzt. Wenn der aufrufende Prozess bereits Sperren für Bytes in dem Bereich hat, der durch die Anforderung angegeben ist, wird vor einer erfolgreichen Rückkehr von einer F_SETLK- oder einer F_SETLKW-Anfor-derung der vorherige Sperren-Typ für jedes Byte in dem angegebenen Bereich durch den neuen Sperren-Typ ersetzt. Wie weiter oben unter der Beschreibung von gemeinsamen Sperren und exklusiven Sperren angegeben ist, schlägt eine F_SETLK- bzw. eine F_-SETLKW-Anforderung fehl oder blockiert, wenn für einen anderen Prozess Sperren für Bytes in dem angegebenen Bereich vorhanden sind und der Typ einer dieser Sperren nicht mit dem Typ in der Anforderung zusammenpasst.

Alle Sperren, die einer Datei für einen bestimmten Prozess zugeordnet sind, werden gelöscht, wenn der Dateideskriptor für diese Datei durch diesen Prozess geschlossen wird oder der Prozess, der den Dateideskriptor enthält, beendet wird. Sperren werden von einem Sohnprozess, der mit der Funktion fork() erzeugt wurde, nicht geerbt.

Es besteht die Gefahr eines Deadlocks, wenn ein Prozess, der einen gesperrten Bereich steuert, zeitweise stillgelegt wird, indem versucht wird, den gesperrten Bereich eines anderen Prozesses zu sperren. Wenn das System entdeckt, dass das Stillegen eines Prozesses bis zur Freigabe eines gesperrten Bereichs dazu führen würde, dass sich das Programm aufhängt, so schlägt die Funktion fcntl() fehl und gibt den Fehler EDEADLK zurück.

Wenn obligatorisches Sperren von Dateien und Dateisätzen in einer Datei aktiv ist (siehe chmod()), werden open()-, read()- und write()-Systemaufrufe auf die Datei durch die eingeschalteten Dateisatzsperren beeinflusst.

Folgender zusätzliche Wert kann beim Erstellen von oflag verwendet werden:

O_LARGEFILE

Falls dieser Wert gesetzt ist, ist das in der internen Beschreibung der offenen Datei festgelegte Offset-Maximum der höchste Wert, der in einem Objekt des Typs off64_t korrekt dargestellt werden kann.

Das Flag O_LARGEFILE kann mit F_SETFL aktiviert oder deaktiviert werden.

Das Verhalten folgender Werte entspricht denen von F_GETLK, F_SETLK, F_SETLKW und F_FREESP, außer dass hier ein Argument vom Typ struct flock64 an Stelle eines Arguments vom Typ struct flock übergeben werden muss:

F_GETLK64, F_SETLK64, F_SETLKW64 und F_FREESP64

Die Struktur flock64 ist wie die von flock (siehe <fcntl()) definiert, außer das gilt:

off64_t l_start und off64_t l_len.

Werden Threads verwendet, so wirkt sich die Funktion auf den Prozess oder auf einen Thread wie folgt aus: Beim Kommando F_SETLKW wartet der Thread, bis die Anforderung befriedigt werden kann.

Returnwert

ein neuer Dateideskriptor



bei erfolgreicher Ausführung des Kommandos F_DUPFD.

 

Wert des Prozess-Statusbytes wie in fcntl.h definiert

 


bei erfolgreicher Ausführung des Kommandos F_GETFD.
Der Wert ist nicht negativ.

 

ein Wert ungleich -1

 


bei erfolgreicher Ausführung der Kommandos F_SETFD, F_SETFL, F_ GETLK, F_SETLK und F_SETLKW

 

der Wert 0

bei erfolgreicher Ausführung des Kommandos F_FREESP

 

der Wert des Datei-Statusbytes und der Zugriffsarten

 


bei erfolgreicher Ausführung des Kommandos F_GETFL.|
Der Wert ist nicht negativ.

 

-1

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehler

fcntl() schlägt fehl, wenn gilt:

 

EACCES

cmd ist F_SETLK, der Typ der Sperre (l_type) ist eine Lesesperre (F_RDLCK), und das Segment einer zu sperrenden Datei ist bereits von einem anderen Prozess schreibgeschützt.

Der Typ ist eine Schreibsperre (F_WRLCK), und das Segment einer zu sperrenden Datei wird bereits von einem anderen Prozess lese- oder schreibgeschützt.

 

EAGAIN

cmd ist F_FREESP, die Datei existiert, obligatorisches Datei-/Datensatzsperren ist gesetzt, und es gibt noch ausstehende Datensatzsperren in der Datei.

 

Erweiterung

 

EAGAIN

cmd ist F_SETLK oder F_SETLKW, und die Datei wird momentan mit mmap() in den virtuellen Speicher abgebildet.(Ende)

 

EBADF

fildes ist kein gültiger offener Dateideskriptor.

cmd ist F_SETLK oder SETLKW, die Sperre (l_type) ist eine Lesesperre (F_RDLCK), und fildes ist kein gültiger, zum Lesen geöffneter Dateideskriptor.

cmd ist F_SETLK oder SETLKW, die Sperre (l_type) ist eine Schreibsperre (F_WRLCK), und fildes ist kein gültiger, zum Schreiben geöffneter Dateideskriptor.

cmd ist F_FREESP, und fildes ist kein gültiger, zum Schreiben geöffneter Dateideskriptor.

 

Erweiterung 

 

EDEADLK

cmd ist F_FREESP, obligatorisches Datensatzsperren ist möglich, O_NDELAY und O_NONBLOCK sind gelöscht, und es wurde eine Situation entdeckt, in der es zu einem Deadlock kommen könnte.(Ende)

 

EDEADLK

cmd ist F_SETLKW, die Sperre ist durch eine Sperre von einem anderen Prozess blockiert, und ein Deadlock würde verursacht, wenn der Prozess angehalten wird, um auf die Aufhebung dieser Sperre zu warten.

 

Erweiterung


EFAULT

cmd ist F_FREESP, und der Wert, auf den arg zeigt, befindet sich in einer Adresse außerhalb des Adressraums, der vom Prozess belegt wird.

cmd ist F_GETLK, F_SET_LK oder F_SETLKW, und der Wert, auf den arg zeigt, befindet sich in einer Adresse außerhalb des Adressraums, der vom Prozess belegt wird.(Ende)

 

EINTR

Ein Signal wurde während des Systemaufrufs fcntl() abgefangen.

 

EINVAL

cmd ist F_DUPFD. arg ist entweder negativ, größer oder gleich dem Wert für die maximale Anzahl der jedem Benutzer zur Verfügung stehenden offenen Dateideskriptoren.

cmd ist F_DUPFD. arg ist entweder negativ, größer oder gleich dem Wert für die maximale Anzahl der jedem Benutzer zur Verfügung stehenden offenen Dateideskriptoren.

cmd besitzt keinen gültigen Wert.

cmd ist F_GETLK, F_SETLK oder SETLKW, und arg oder die Daten, auf die verwiesen wird, sind nicht gültig; oder fildes gibt eine Datei an, die Sperren nicht unterstützt.

Es wurde versucht, auf eine BS2000-Datei zuzugreifen.

 

Erweiterung 

 

EIO

Während des Lesens oder Schreibens im Dateisystem trat ein Ein-/Ausgabefehler auf.(Ende)

 

EMFILE

cmd ist F_DUPFD, und im aufrufenden Prozess ist die Anzahl der offenen Dateideskriptoren gleich dem in der Konfiguration angegebenen Maximalwert der offenen Dateien für jeden Benutzer.

 

ENOLCK

cmd ist F_SETLK oder F_SETLKW, der Typ der Sperre ist eine Lese- oder Schreibsperre, und keine weiteren Dateisatzsperren stehen zur Verfügung (zuviele Dateisegmente gesperrt), weil das Maximum des Systems überschritten wurde.

 

ENOLINK

fildes ist auf einem fernen Rechner und die Verbindung zu diesem Rechner ist nicht aktiv bzw. cmd ist F_FREESP, die Datei auf einem fernen Rechner und die Verbindung dahin nicht aktiv.

 

EOVERFLOW

Einer der zurückgegebenen Werte kann nicht korrekt dargestellt werden.

Hinweise

fcntl() wird nur für POSIX-Dateien ausgeführt.

Siehe auch

close(), creat(), dup(), exec(), fork(), open(), sigaction(), pipe(), fcntl.h, sys/type.h, unistdt.h.