Subroutine schließen
Zweck
Schließt einen Dateideskriptor.
Syntax
#include <unistd.h>
Beschreibung
Die Subroutine close schließt das Datei-oder gemeinsam genutzte Speicherobjekt, das dem Parameter FileDescriptor zugeordnet ist. Wenn Network File System (NFS) auf Ihrem System installiert ist, kann sich diese Datei auf anderen Knoten befinden.
Alle Dateibereiche, die der mit dem Parameter FileDescriptor angegebenen Datei zugeordnet sind, die dieser Prozess zuvor mit der Subroutine lockf oder fcntl gesperrt hat, werden entsperrt. Dies tritt auch dann auf, wenn der Prozess die Datei noch durch einen anderen Dateideskriptor geöffnet hat.
Wenn der Parameter FileDescriptor aus einer Subroutine open resultiert, die O_DEFERangibt, und dies der letzte Dateideskriptor war, werden alle Änderungen, die seit der letzten Subroutine fsync an der Datei vorgenommen wurden, verworfen.
Wenn der Parameter FileDescriptor einer zugeordneten Datei zugeordnet ist, wird die Zuordnung aufgehoben. Die Subroutine shmat stellt weitere Informationen über zugeordnete Dateien bereit.
Die Subroutine close versucht, ausstehende asynchrone E/A-Anforderungen für diesen Dateideskriptor abzubrechen. Wenn die asynchronen E/A-Anforderungen nicht abgebrochen werden können, wird die Anwendung blockiert, bis die Anforderungen abgeschlossen sind.
Wenn der Parameter FileDescriptor einem gemeinsam genutzten Speicherobjekt zugeordnet ist und das gemeinsam genutzte Speicherobjekt beim letzten Schließen referenziert wird (d. h., ein Prozess hat es zugeordnet), bleibt der gesamte Inhalt des Speicherobjekts bestehen, bis das Speicherobjekt nicht mehr referenziert wird. Wenn dies der letzte Abschluss eines gemeinsam genutzten Speicherobjekts ist und das Schließen dazu führt, dass das Speicherobjekt nicht mehr referenziert wird und die Verbindung des Speicherobjekts aufgehoben wurde, wird das Speicherobjekt entfernt. Die Subroutine shm_open stellt weitere Informationen zu gemeinsam genutzten Speicherobjekten bereit.
Die Subroutine close wird geblockt, bis alle Subroutinen, die den Dateideskriptor verwenden, in den Speicherbereich usr zurückkehren. Wenn ein Thread beispielsweise close aufruft und ein anderer Thread select mit demselben Dateideskriptor aufruft, wird die Subroutine close erst zurückgegeben, wenn der Aufruf select zurückgegeben wird.
Wenn alle Dateideskriptoren, die einer Pipe-oder FIFO-Gerätedatei zugeordnet sind, geschlossen wurden, werden alle in der Pipe oder FIFO verbliebenen Daten gelöscht. Wenn die Linkanzahl der Datei 0 ist, wenn alle Dateideskriptoren, die der Datei zugeordnet sind, geschlossen wurden, wird der von der Datei belegte Speicherbereich freigegeben, und die Datei ist nicht mehr zugänglich.
Alle offenen Dateideskriptoren werden geschlossen, wenn ein Prozess beendet wird. Außerdem können Dateideskriptoren während der Subroutine exec geschlossen werden, wenn das Flag close-on-exec für diesen Dateideskriptor gesetzt wurde.
Parameter
| Element | Beschreibung |
|---|---|
| FileDescriptor | Gibt einen gültigen offenen Dateideskriptor an. |
Rückgabewerte
Nach erfolgreicher Ausführung wird der Befehl 0 zurückgegeben. Andernfalls wird der Wert -1 zurückgegeben, und die globale Variable errno wird gesetzt, um den Fehler zu identifizieren.
Die zugrunde liegende Dateisystemimplementierung kann jeden beliebigen Wert aus der Datei /usr/include/errno.h an die Subroutine close melden. Das Unterprogramm close gibt den Wert -1 zurück und die globale Variable errno wird auf den Rückgabewert des Dateisystems gesetzt, aber die Datei wird trotzdem geschlossen. Der Zustand des FileDescriptor ist geschlossen, es sei denn, es liegen die im Abschnitt " Fehlercodes" genannten Bedingungen vor.
Fehlercodes
Die Subroutine close ist nicht erfolgreich, wenn Folgendes zutrifft:
| Element | Beschreibung |
|---|---|
| EBADF | Der Parameter FileDescriptor gibt keinen gültigen offenen Dateideskriptor an. |
Die Subroutine close kann auch nicht erfolgreich sein, wenn die Datei, die geschlossen wird, über NFSangehängt ist und der Server unter den folgenden Bedingungen inaktiv ist:
- Die Datei befindet sich in einem permanenten Mount.
- Die Datei ist auf beliebige Weise gesperrt.
Die Subroutine close kann auch nicht erfolgreich sein, wenn NFS installiert ist und Folgendes zutrifft:
| Element | Beschreibung |
|---|---|
| ETIMEDOUT | Das Zeitlimit für die Verbindung wurde überschritten. |
| Element | Beschreibung |
|---|---|
| EINTR | Der Status des Dateideskriptors ( FileDescriptor ) ist nicht bestimmt. Wiederholen Sie die Routine close , um sicherzustellen, dass FileDescriptor geschlossen ist. |