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. |