bionic (2) fcntl.2.gz

Provided by: manpages-de-dev_2.5-1_all bug

BEZEICHNUNG

       fcntl - Dateideskriptoren manipulieren

ÜBERSICHT

       #include <unistd.h>
       #include <fcntl.h>

       int fcntl(int fd, int cmd,  /* arg */ );

BESCHREIBUNG

       fcntl()  führt  eine  der unten beschriebenen Aktionen auf dem offenen Dateideskriptor fd aus. Die Aktion
       wird durch cmd festgelegt.

       fcntl() kann ein optionales drittes Argument akzeptieren. Ob dieses Argument notwendig ist,  ergibt  sich
       durch  cmd.  Der  benötigte  Argumenttyp wird nach jedem cmd-Namen in Klammern angedeutet (in den meisten
       Fällen ist der benötigte Typ int und der Argumenttyp wird mit dem Namen  arg  identifiziert).  Falls  das
       Argument nicht notwendig ist, wird void angegeben.

       Bestimmte   der  unten  aufgeführten  Aktionen  werden  nur  seit  einer  bestimmten  Linux-Kernelversion
       unterstützt. Die  bevorzugte  Methode,  um  herauszufinden,  ob  der  Gastkernel  eine  bestimmte  Aktion
       unterstützt,  ist der Aufruf von fcntl() mit dem gewünschten Wert von cmd und dem anschließenden Test, ob
       der Aufruf mit EINVAL fehlschlug, wodurch angezeigt wird, dass der Kernel diesen Wert nicht unterstützt.

   Duplizieren eines Dateideskriptors
       F_DUPFD (int)
              verdoppelt den Dateideskriptor fd unter Verwendung des Dateideskriptors mit der kleinsten  Nummer,
              die  identisch  zu  oder  größer  als  arg ist. Dies unterscheidet sich von dup2(2), das exakt den
              angegebenen Dateideskriptor verwendet.

              Bei Erfolg wird der neue Dateideskriptor zurückgegeben.

              Lesen Sie dup(2) für weitere Details.

       F_DUPFD_CLOEXEC (int; seit Linux 2.6.24)
              Wie für  F_DUPFD,  setzt  aber  zusätzlich  den  Schalter  »close-on-exec«  für  den  duplizierten
              Dateideskriptor.  Die  Angabe  dieses  Schalters  ermöglicht  es  einem Programm, eine zusätzliche
              fcntl()-F_SETFD-Aktion zu vermeiden, um den Schalter FD_CLOEXEC zu setzen. Für  eine  Erläuterung,
              warum dieser Schalter nützlich ist, lesen Sie die Beschreibung von O_CLOEXEC in open(2).

   Datei-Deskriptor-Schalter
       Die  folgenden  Befehle  verändern  die  einem Dateideskriptor zugeordneten Schalter. Derzeit ist nur ein
       solcher Schalter definiert: FD_CLOEXEC, der »close-on-exec«-Schalter. Falls  das  FD_CLOEXEC-Bit  gesetzt
       ist,  wird  der  Dateideskriptor  automatisch  bei  einem erfolgreichen execve(2) geschlossen. (Falls der
       execve(2) fehlschlägt, bleibt der Dateideskriptor offen.) Falls das Bit  FD_CLOEXEC  nicht  gesetzt  ist,
       wird der Dateideskriptor über ein execve(2) hinweg offen bleiben.

       F_GETFD (void)
              Liefert (als Ergebnis der Funktion) die Dateideskriptorschalter; arg wird ignoriert.

       F_SETFD (int)
              Setzt den Dateideskriptorschalter auf den durch arg angegebenenen Wert.

       In   Programmen   mit  mehreren  Threads  ist  die  Verwendung  von  fcntl()  F_SETFD,  um  den  Schalter
       »close-on-exec« zum gleichen Zeitpunkt zu setzen, zu  dem  ein  anderer  Thread  ein  fork(2)  mit  einem
       execve(2)  ausführt, anfällig für einen Ressourcenwettlauf, der unbeabsichtigterweise den Dateideskriptor
       an das Programm, das im Kindprozess  läuft,  durchsickern  lässt.  Siehe  die  Diskussion  des  Schalters
       O_CLOEXEC in open(2) für Details und wie dem Problem abgeholfen werden kann.

   Dateistatusschalter
       Jede  offene  Dateideskription  hat bestimmte zugeordnete Statusschalter, die durch open(2) initialisiert
       und  möglicherweise  durch  fcntl()  verändert  werden.  Duplizierte   Dateideskriptoren   (mit   dup(2),
       fcntl(F_DUPFD),  fork(2) usw. erstellte) beziehen sich auf die gleiche offene Dateideskription und teilen
       sich daher die gleichen Dateistatusschalter.

       Die Dateistatusschalter und deren Bedeutung sind in open(2) beschrieben.

       F_GETFL (void)
              Liefert (als Ergebnis der Funktion) den Dateizugriffsmodus und die Dateistatusschalter;  arg  wird
              ignoriert.

       F_SETFL (int)
              Setzt  die  Dateistatusschalter auf den durch arg festgelegten Wert. Dateizugriffsmodus (O_RDONLY,
              O_WRONLY, O_RDWR) und Dateierzeugungsschalter (d.h. O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) werden  in
              arg  ignoriert.  Unter  Linux  kann  dieser  Befehl  nur die Schalter O_APPEND, O_ASYNC, O_DIRECT,
              O_NOATIME und O_NONBLOCK ändern. Es ist nicht möglich, die Schalter O_DSYNC und O_SYNC zu  ändern,
              siehe FEHLER weiter unten.

   Empfohlene Datensatzsperren
       Linux   implementiert  traditionelle  (»Prozess-orientierte«)  UNIX-Datensatz-Sperren,  wie  durch  POSIX
       standardisiert. Für eine Linux-spezifische Alternative mit besserer Semantik  lesen  Sie  die  Diskussion
       über offene Dateideskriptions-Sperren unten.

       F_SETLK,  F_SETLKW  und  F_GETLK werden dazu verwandt, Datensatzsperren (auch bekannt als Byte-Bereichs-,
       Dateisegment- oder Dateiregionsperren) zu erlangen, abzugeben oder auf  deren  Existenz  zu  prüfen.  Das
       dritte  Argument,  lock,  ist  ein Zeiger auf eine Struktur, die mindestens die folgende Felder (in einer
       nicht festgelegten Reihenfolge) enthält:

           struct flock {
               …
               short l_type;    /* Art der Sperre: F_RDLCK,
                                   F_WRLCK, F_UNLCK */
               short l_whence;  /* Wie l_start interpretiert wird:
                                   SEEK_SET, SEEK_CUR, SEEK_END */
               off_t l_start;   /* Anfangsversatz für Sperre */
               off_t l_len;     /* Anzahl von zu sperrenden Bytes */
               pid_t l_pid;     /* PID des Prozesses, der unsere Sperre blockiert
                                   (gesetzt durch F_GETLK und F_OFD_GETLK) */
               …
           };

       Die Felder l_whence, l_start und l_len dieser Struktur legen den Bereich der Bytes, die  gesperrt  werden
       sollen,  fest.  Bytes hinter dem Ende der Datei können gesperrt sein, aber Bytes vor dem Anfang der Datei
       sind es nicht.

       l_start ist der Startversatz für die Sperre und wird relativ zu einem der  folgenden  interpretiert:  Dem
       Anfang  der Datei (falls l_whence SEEK_SET ist) oder dem Ende der Datei (falls l_whence SEEK_END ist). In
       den abschließenden zwei Fällen kann l_start eine negative Zahl sein,  vorausgesetzt,  der  Versatz  liegt
       nicht vor dem Anfang der Datei.

       l_len  legt  die  Anzahl  der  zu  sperrenden  Bytes fest. Falls l_len positiv ist, wird der zu sperrende
       Bereich die Bytes l_start bis einschließlich l_start+l_len-1 umfassen. Die Angabe von  0  für  l_len  hat
       eine  besondere  Bedeutung: Alle Bytes beginnend bei l_whence und l_start bis zum Ende der Datei sperren,
       unabhängig davon, wie groß die Datei anwächst.

       POSIX.1-2001 erlaubt (verlangt es aber nicht), dass eine Implementierung einen negativen Wert  für  l_len
       unterstützt. Falls l_len negativ ist, deckt das durch lock beschriebene Intervall die Bytes l_start+l_len
       bis zu einschließlich  l_start-1  ab.  Dies  wird  durch  Linux  seit  Kernelversion  2.4.21  and  2.5.49
       unterstützt.

       Das  Feld  l_type  kann  dazu verwandt werden, eine Lese- (F_RDLCK) oder Schreibsperre (F_WRLCK) auf eine
       Datei zu setzen. Eine beliebige Anzahl an Prozessen kann eine  Lesesperre  auf  eine  Dateiregion  halten
       (gemeinsame  Sperre),  aber  nur  ein  Prozess  kann  eine  Schreibsperre (exklusive Sperre) halten. Eine
       exklusive Sperre sperrt alle anderen Sperren aus, sowohl exklusive als  auch  gemeinsame.  Ein  einzelner
       Prozess kann nur eine Art von Sperre auf eine Dateiregion halten. Falls eine neue Sperre auf eine bereits
       gesperrte Region angewandt wird, wird die existierende Sperre in den Typ der  neuen  Sperre  umgewandelt.
       (Solche Umwandlungen können das Teilen, Verkleinern, Vereinigen mit bestehenden Sperren beinhalten, falls
       der durch die neue Sperre festgelegte Byte-Bereiche nicht genau mit dem Bereich der bereits existierenden
       Sperre zusammenfällt.)

       F_SETLK (struct flock *)
              Erlangt (wenn l_type F_RDLCK oder F_WRLCK ist) oder gibt eine Sperre (wenn l_type F_UNLCK ist) für
              die durch die Felder l_whence, l_start und l_len von lock festgelegten Bytes ab. Falls durch einen
              anderen  Prozess  eine  im Konflikt stehende Sperre gehalten wird, liefert dieser Aufruf -1 zurück
              und setzt errno auf EACCES oder EAGAIN. (Der in diesem Fall zurückgelieferte Fehler  unterscheidet
              sich  zwischen Implementierungen, daher verlangt POSIX, dass portable Anwendungen auf beide Fehler
              prüfen.)

       F_SETLKW (struct flock *)
              Wie für F_SETLK, aber bei Konflikten um eine Sperre auf die Datei wird auf die Freigabe der Sperre
              gewartet.  Falls während des Wartens ein Signal abgefangen wird, dann wird der Aufruf unterbrochen
              und (nachdem der Signalbearbeiter zurückgekehrt ist) sofort zurückgekehrt (mit dem Rückgabewert -1
              und errno auf EINTR gesetzt; siehe signal(7)).

       F_GETLK (struct flock *)
              Als  Eingabe  zu  diesem  Aufruf beschreibt lock eine Sperre, die auf diese Datei angewandt werden
              soll. Falls die Sperre angewandt werden  könnte,  setzt  fcntl()  diese  nicht  wirklich,  sondern
              liefert  F_UNLCK  in  dem  Feld  l_type  von  lock  und  lässt  die anderen Felder dieser Struktur
              unverändert.

              Falls eine oder mehrere inkompatible Sperren das Setzen dieser Sperre verhinderten,  dann  liefert
              fcntl()  Details  über  eine dieser Sperren in den Feldern l_type, l_whence, l_start und l_len von
              lock zurück. Falls die  im  Konflikt  stehende  Sperre  eine  traditionelle  (Prozess-orientierte)
              Datensatzsperre  ist,  dann  wird das Feld l_pid auf die PID des Prozesses gesetzt, der die Sperre
              hält. Falls die in Konflikt stehende Sperre eine offene  Dateideskriptionssperre  ist,  dann  wird
              l_pid  auf  -1  gesetzt.  Beachten  Sie,  dass  die zurückgelieferte Information zum Zeitpunkt der
              Analyse durch den Aufrufenden bereits veraltet sein kann.

       Um eine Lesesperre zu setzen, muss fd zum Lesen offen sein. Um eine Schreibsperre zu setzen, muss fd  zum
       Schreiben offen sein. Um beide Typen setzen zu können, öffnen Sie eine Datei lese- und schreibbar.

       Wenn  Sperren  mit  F_SETLKW  gesetzt  werden, erkennt der Kernel Verklemmungen, bei denen zwei oder mehr
       Prozesse ihre Sperr-Anfragen gegenseitig durch  Sperren,  die  von  anderen  Prozessen  gehalten  werden,
       blockieren.  Nehmen Sie beispielsweise an, Prozess A hält eine Schreibsperre auf Byte 100 einer Datei und
       Prozess B hält eine Schreibsperre auf Byte 200. Falls jeder Prozess dann versucht, mit F_SETLKW  die  vom
       anderen  Prozess  bereits  gesperrten  Bytes  zu  sperren,  würden ohne Erkennung von Verklemmungen beide
       Prozesse unbegrenzt blockiert bleiben. Wenn der Kernel solche Verklemmungen erkennt, sorgt er dafür, dass
       eine  der  blockierenden Sperranfragen sofort mit dem Fehler EDEADLK fehlschlägt. Eine Anwendung, die auf
       einen solchen Fehler trifft, sollte einige ihrer Sperren freigeben, um anderen Anwendungen das Fortfahren
       zu  erlauben,  bevor  sie  erneut  versucht,  die  von  ihr  benötigten  Sperren  zu  erlangen. Zirkuläre
       Verklemmungen mit mehr als zwei Prozessen werden auch erkannt. Beachten Sie aber, dass es eine Begrenzung
       der Erkennung von Verklemmungen im Kernel gibt; siehe FEHLER.

       Datensatzsperren werden durch ein explizites F_UNLCK entfernt und auch freigegeben, wenn der Prozess sich
       beendet.

       Datensatzsperren werden nicht von einem durch fork(2) erstellten Kind geerbt,  aber  über  ein  execve(2)
       hinweg erhalten.

       Aufgrund   des   durch   die  stdio(3)-Bibliothek  durchgeführten  Pufferns  sollte  die  Verwendung  von
       Datensatzsperren mit Routinen aus diesem Paket vermieden werden; verwenden Sie  stattdessen  read(2)  und
       write(2).

       Die weiter oben beschriebenen Datensatzsperren werden dem Prozess zugeordnet (anders als die weiter unten
       beschriebenen Dateideskriptionssperren). Dies hat einige unglückliche Konsequenzen:

       *  Falls ein Prozess irgendeinen Dateideskriptor mit Bezug zu einer  Datei  schließt,  dann  werden  alle
          Sperren  des  Prozesses  für diese Datei aufgehoben, unabhängig von den Dateideskriptor(en), mit denen
          diese Sperren erworben wurden. Das ist schlecht: Es bedeutet, dass ein Prozess seine Sperren auf  eine
          Datei   wie   /etc/passwd   oder   /etc/mtab   verlieren   kann,   wenn  aus  irgendeinem  Grund  eine
          Bibliotheksfunktion sich entscheidet, die gleiche Datei zu öffnen, zu lesen und zu schließen.

       *  Die Threads in einem Prozess nutzen die Sperren  gemeinsam.  Mit  anderen  Worten,  ein  Programm  mit
          mehreren  Threads  kann  Datensatzsperren  nicht  benutzen, um sicherzustellen, dass die Threads nicht
          simultan auf die gleichen Regionen einer Datei zugreifen.

       Offene Dateideskriptionssperren lösen beide Probleme.

   Offene Dateideskriptionssperren (nicht POSIX)
       Offene Dateideskriptionsperren sind empfohlene Byte-Bereichssperren, deren Funktionsweise in den  meisten
       Aspekten   den  herkömmlichen,  oben  beschriebenen  Datensatzsperren  entspricht.  Dieser  Sperrtyp  ist
       Linux-spezifisch und seit Linux 3.15 verfügbar.  (Es  gibt  einen  Vorschlag  der  Austin-Gruppe,  diesen
       Sperrtyp in die nächste Überarbeitung von POSIX.1 aufzunehmen.) Eine Erklärung offener Dateideskriptionen
       finden Sie in open(2).

       Der  Hauptunterschied  zwischen  den  beiden   Sperrtypen   besteht   darin,   dass   die   herkömmlichen
       Datensatzsperren  mit  einem  Prozess  verbunden sind, während Sperren offener Dateideskriptionen mit der
       offenen Dateideskription verbunden sind, für die  sie  erlangt  wurden,  ähnlich  wie  Sperren,  die  mit
       flock(2)  erlangt  wurden.  Konsequenterweise  (und  anders als herkömmliche empfohlene Datensatzsperren)
       werden Sperren offener Dateideskriptionen über fork(2) (und clone(2) mit CLONE_FILES) geerbt  und  werden
       nur  automatisch  durch  das  Schließen der letzten offenen Dateideskription freigegeben, statt bei jedem
       Schließen der Datei.

       Im Konflikt stehende Kombinationen von Sperren (d.h. eine Lese-Sperre und eine Schreib-Sperre  oder  zwei
       Schreib-Sperren), wobei eine Sperre eine offene Dateideskriptionssperre und die andere eine traditionelle
       Datensatzsperre ist, sind selbst dann im Konflikt,  wenn  sie  vom  gleichen  Prozess  auf  dem  gleichen
       Dateideskriptor aufgenommen wurden.

       Offene Dateideskriptionssperren, die über die gleichen offenen Dateideskriptionen (d.h. über den gleichen
       Dateideskriptor oder über durch fork(2), dup(2), fcntl() F_DUPFD und so weiter  erstellte  Duplikate  des
       Dateideskriptors)  gesetzt werden, sind immer kompatibel: Falls auf einen bereits gesperrten Bereich eine
       neue Sperre gesetzt wird, wird die  existierende  Sperre  in  den  neuen  Sperrtyp  umgewandelt.  (Solche
       Umwandlungen   können   wie  oben  beschrieben  zum  Teilen,  Verkleinern  oder  Verschmelzen  mit  einer
       existierenden Sperre führen.)

       Auf der anderen Seite können offene Dateideskriptionssperren zueinander im Konflikt stehen, wenn sie über
       verschiedene  offene  Dateideskriptionen  erlangt  wurden. Daher können die Threads in einem Programm mit
       mehreren Threads offene Dateideskriptionssperren dazu verwenden, um  den  Zugriff  auf  Dateiregionen  zu
       koordinieren,  indem  jeder Thread sein eigenes open(2) auf der Datei durchführt und die Sperren über den
       entstehenden Dateideskriptor anwendet.

       Wie bei herkömmlichen empfohlenen Sperren ist das dritte Argument für fcntl(), lock, ein Zeiger auf  eine
       flock-Struktur.  Im  Gegensatz  zu herkömmlichen Datensatzsperren muss das Feld l_pid dieser Struktur bei
       Verwendung der unterhalb beschriebenen Befehle auf Null gesetzt werden.

       Die Befehle  für  den  Umgang  mit  offenen  Dateideskriptionssperren  sind  analog  zu  denen,  die  mit
       traditionellen Sperren verwandt werden:

       F_OFD_SETLK (struct flock *)
              Erlangt  eine offene Dateideskriptionssperre (wenn l_type F_RDLCK oder F_WRLCK ist) oder gibt eine
              offene Dateideskriptionssperre frei (wenn l_type F_UNLCK ist), für die Bytes, die durch die Felder
              l_whence,  l_start  und  l_len festgelegt sind. Falls durch einen anderen Prozess eine im Konflikt
              stehende Sperre gehalten wird, liefert der Aufruf -1 zurück und setzt errno auf EAGAIN.

       F_OFD_SETLKW (struct flock *)
              Wie bei F_OFD_SETLK, aber falls eine im Konflikt stehende Sperre auf der Datei gehalten wird, dann
              wird  auf  die  Freigabe  dieser Sperre gewartet. Falls beim Warten ein Signal gefangen wird, dann
              wird  der  Aufruf  unterbrochen  und  (nachdem  der  Signal-Handler  zurückgekehrt   ist)   sofort
              zurückgekehrt (mit einem Rückgabewert -1 und errno auf EINTR gesetzt, siehe signal(7)).

       F_OFD_GETLK (struct flock *)
              Bei  der Eingabe zu diesem Aufruf beschreibt lock eine offene Dateideskriptionssperre, die auf der
              Datei gesetzt werden soll. Falls die  Sperre  gesetzt  werden  könnte,  setzt  sie  fcntl()  nicht
              wirklich,  sondern liefert im Feld l_type von lock F_UNLCK zurück und lässt die anderen Felder der
              Struktur unverändert. Falls eine oder  mehrere  inkompatible  Sperren  das  Setzen  dieser  Sperre
              behinderten,  werden  die  Details  über  eine  dieser  Sperren mittels lock, wie oben für F_GETLK
              beschrieben, zurückgeliefert.

       In der aktuellen  Implementierung  wird  nicht  auf  Verklemmungen  für  offene  Dateideskriptionssperren
       geprüft.  (Dies steht im Gegensatz zu den prozessorientierten Datensatzsperren, bei denen der Kernel eine
       Erkennung von Verklemmungen durchführt.)

   Pflichtsperren
       Warnung: Die Linux-Implementierung der Pflichtsperren ist unzuverlässig.  Siehe  FEHLER  unten.  Aufgrund
       dieser  Fehler  und  der  Tatsache,  dass davon ausgegangen wird, dass diese Funktionalität wenig genutzt
       wird,  sind  die  Pflichtsperren  seit  Linux  4.5  eine  optionale  Funktionalität,   die   durch   eine
       Konfigurationsoption (CONFIG_MANDATORY_FILE_LOCKING) gesteuert werden. Dies ist der erste Schritt hin zur
       kompletten Entfernung dieser Funktionalität.

       Standardmäßig sind herkömmliche  (prozessorientierte)  und  Sperren  offener  Dateideskriptionsdatensätze
       empfohlene  Sperren.  Empfohlene  Sperren  werden nicht erzwungen und sind nur bei der Zusammenarbeit von
       Prozessen nützlich.

       Beide Sperrtypen können  auch  verpflichtend  sein.  Verpflichtende  Sperren  werden  für  alle  Prozesse
       durchgesetzt. Falls ein Prozess einen inkompatiblen Zugriff auf einen Dateibereich versucht (z.B. read(2)
       oder write(2)), der eine inkompatible verpflichtende Sperre hat, dann hängt das Ergebnis davon ab, ob der
       Schalter  O_NONBLOCK für seine offene Dateideskription aktiviert ist. Falls der Schalter O_NONBLOCK nicht
       aktiviert ist, wird der Systemaufruf blockiert, bis die Sperre entfernt oder in einen  Modus  umgewandelt
       wurde,  der  mit  dem  Zugriff  kompatibel  ist.  Falls  der  Schalter O_NONBLOCK aktiviert ist, wird der
       Systemaufruf mit dem Fehler EAGAIN fehlschlagen.

       Um verpflichtende Sperren zu verwenden, müssen verpflichtende Sperren sowohl auf dem Dateisystem, das die
       zu sperrende Datei enthält, aktiviert werden als auch auf der Datei selbst. Verpflichtende Sperren werden
       auf Dateisystemen mit der Option »-o mand« von  mount(8)  oder  dem  Schalter  MS_MANDLOCK  für  mount(2)
       aktiviert.  Verpflichtende  Sperren werden für eine Datei aktiviert, indem das Ausführrecht für die Datei
       entfernt und das »set-group-ID«-Rechte-Bit aktiviert wird (siehe chmod(1) und chmod(2)).

       Verpflichtende Sperren werden nicht durch POSIX spezifiziert. Einige  andere  Systeme  unterstützen  auch
       verpflichtende Sperren, allerdings unterscheiden sich die Details zur Aktivierung zwischen den Systemen.

   Verlorene Sperren
       Wenn  eine empfohlene Sperre auf einem Netzwerkdateisystem wie NFS erlangt wird, ist es möglich, dass die
       Sperre verloren geht. Die kann aufgrund administrativer Aktionen  auf  dem  Server  oder  aufgrund  einer
       Netzwerkeinteilung (d.h. einem Verlust der Netzverbindung mit dem Server) passieren, die so lange dauert,
       dass der Server annimmt, dass der Client nicht mehr funktioniert.

       Wenn das Dateisystem ermittelt, dass eine Sperre verloren gegangen ist, können zukünftige  read(2)-  oder
       write(2)-Anfragen  mit  dem  Fehler  EIO  fehlschlagen.  Dieser  Fehler  wird beibehalten, bis die Sperre
       entfernt oder der Dateideskriptor geschlossen wird. Seit Linux 3.12 passiert  dies  zumindest  auf  NFSv4
       (einschließlich aller Unterversionen).

       Einige  UNIX-Versionen  senden in diesen Fällen ein Signal (SIGLOST). Linux definiert dieses Signal nicht
       und stellt keine asynchrone Benachrichtigung über verlorene Sperren bereit.

   Signale verwalten
       F_GETOWN,  F_SETOWN,  F_GETOWN_EX,  F_SETOWN_EX,  F_GETSIG  und  F_SETSIG  werden  zur   Verwaltung   der
       E/A-Verfügbarkeitssignale verwandt:

       F_GETOWN (void)
              Liefert  (als  Funktionsergebnis) die Prozesskennung oder Prozessgruppe zurück, die derzeit SIGIO-
              und SIGURG-Signale für Ereignisse auf  Dateideskriptor  fd  erhält.  Prozesskennungen  werden  als
              positive Werte, Prozessgruppenkennungen als negative Werte zurückgeliefert (siehe aber auch FEHLER
              unten). arg wird ignoriert.

       F_SETOWN (int)
              Setzt die Prozesskennung oder Prozessgruppenkennung, die SIGIO- und SIGURG-Signale für  Ereignisse
              auf  dem  Dateideskriptor fd erhalten wird. Der Zielprozess oder die Zielprozessgruppe wird in arg
              festgelegt. Eine Prozesskennung wird als positiver, eine Prozessgruppenkennung wird als  negativer
              Wert  festgelegt.  Häufig  legt sich der aufrufende Prozess als der Eigentümer fest (d.h. arg wird
              als getpid(2) festgelegt).

              Neben dem Setzen des Dateideskriptoreigentümers muss auch  die  Erzeugung  von  Signalen  auf  dem
              Dateideskriptor  aktiviert  werden.  Dies  erfolgt  durch  den  Befehl  fcntl()  F_SETFL,  um  den
              Dateistatusschalter SIGIO zu setzen, immer wenn Ein- oder Ausgabe auf dem Dateideskriptor  möglich
              wird.  Der  Befehl fcntl() F_SETSIG kann zum Erhalt des Empfangs von Signalen neben SIGIO verwandt
              werden.

              Senden von Signalen an den durch  F_SETOWN  festgelegten  Prozesseigner  (Gruppe)  unterliegt  den
              gleichen Rechteprüfungen wie sie in kill(2) beschrieben sind, wobei der sendende Prozess derjenige
              ist, der F_SETOWN einsetzt (siehe aber FEHLER unten). Falls diese Rechteprüfung fehlschlägt,  wird
              das Signal ohne Rückmeldung verworfen. Hinweis: Die Aktion F_SETOWN notiert die Berechtigungen des
              Aufrufenden zum Zeitpunkt des Aufrufs von fcntl() und es sind diese gespeicherten  Berechtigungen,
              die für die Rechteüberprüfung verwandt werden.

              Falls  der  Dateideskriptor  fd sich auf ein Socket bezieht, wählt F_SETOWN auch den Empfänger des
              Signals SIGURG, das ausgeliefert wird, wenn Außerbanddaten beim Socket  eintreffen,  aus.  (SIGURG
              wird   in   jeder   Situation   gesandt,  in  der  select(2)  berichtete,  dass  das  Socket  eine
              »außergewöhnliche Bedingung« habe.)

              Das Folgende stimmte in 2.6.x-Kerneln bis einschließlich 2.6.11:

                     Falls in einem Prozess mit mehreren Threads, der mit einer Threading-Bibliothek läuft,  die
                     Thread-Gruppen  unterstützt  (z.B.  NPTL),  ein  von  Null  verschiedener  Wert an F_SETSIG
                     übergeben wird, dann hat ein an F_SETOWN übergebener positiver Wert eine andere  Bedeutung:
                     Statt  eine  Prozesskennung  zu sein, die einen gesamten Prozess identifiziert, ist es eine
                     Thread-Kennung,  die  einen  bestimmten  Prozess  innerhalb  des   Threads   identifiziert.
                     Konsequenterweise  kann  es  notwendig  sein, F_SETOWN das Ergebnis von gettid(2) statt von
                     getpid(2) zu übergeben, um vernünftige Ergebnisse zu erhalten, wenn F_SETSIG benutzt  wird.
                     (In aktuellen Linux-Threading-Implementierungen ist die Kennung des Haupt-Threads identisch
                     zu seiner Prozesskennung. Das bedeutet, dass ein Programm mit nur einem einzigen Thread  in
                     diesem  Szenario genauso gettid(2) oder getpid(2) verwenden kann.) Beachten Sie allerdings,
                     dass die Aussage in diesem Absatz nicht auf das Signal SIGURG für  Außerbanddaten  für  ein
                     Socket  zutrifft:  Dieses  Signal  wird  immer  zu  einem  Prozess oder einer Prozessgruppe
                     gesandt, abhängig vom in F_SETOWN übergebenen Wert.

              Das  obige  Verhalten  wurde  in  Linux  2.6.12  versehentlich  deaktivert  und  wird  nicht  mehr
              wiederhergestellt.  Seit  Linux  2.6.32 verwenden Sie F_SETOWN_EX, um die Signale SIGIO und SIGURG
              auf einen bestimmten Thread anzuwenden.

       F_GETOWN_EX (struct f_owner_ex *) (seit Linux 2.6.32)
              Liefert die aktuellen Eigenschaften des Dateideskriptoreigentümers, wie sie von  einer  vorherigen
              F_SETOWN_EX-Aktion  definiert  wurden,  zurück.  Die Information wird in der Struktur, auf die arg
              zeigt, zurückgeliefert. Sie hat die folgende Form:

                  struct f_owner_ex {
                      int   type;
                      pid_t pid;
                  };

              Das Feld type wird einen der Werte F_OWNER_TID, F_OWNER_PID oder F_OWNER_PGRP enthalten. Das  Feld
              pid  ist eine positive Ganzzahl, die die Thread-Kennung, Prozesskennung oder Prozessgruppenkennung
              darstellt. Siehe F_SETOWN_EX für weitere Details.

       F_SETOWN_EX (struct f_owner_ex *) (seit Linux 2.6.32)
              Diese Aktion  führt  eine  ähnliche  Aufgabe  wie  F_SETOWN  aus.  Sie  erlaubt  dem  Aufrufenden,
              E/A-Verfügbarkeitssignale  zu  einem  bestimmten  Thread,  Prozess  oder  einer  Prozessgruppe  zu
              dirigieren. Der Aufrufende bestimmt das Ziel der Signale mittels arg,  der  ein  Zeiger  auf  eine
              Struktur  f_owner_ex  ist.  Das  Feld  type  hat einen der folgenden Werte, der definiert, wie pid
              interpretiert wird:

              F_OWNER_TID
                     Sendet das Signal an den Thread, dessen Thread-Kennung (der von den Aufrufen clone(2)  oder
                     gettid(2) zurückgelieferte Wert) in pid festgelegt ist.

              F_OWNER_PID
                     Sendet das Signal an den Prozess dessen ID in pid angegeben ist.

              F_OWNER_PGRP
                     Sendet das Signal zu der Prozessgruppe, deren Kennung in pid festgelegt ist. (Beachten Sie,
                     dass anders als bei F_SETOWN, eine Prozessgruppenkennung hier als positiver Wert festgelegt
                     ist.)

       F_GETSIG (void)
              Liefert  (als  Funktionsergebnis)  das  Signal  zurück,  das gesendet wird, wenn Ein- oder Ausgabe
              möglich  wird.  Ein  Wert  von  Null  bedeutet,  dass  SIGIO  gesandt  wird.  Jeder  andere   Wert
              (einschließlich  SIGIO)  ist  stattdessen  das  gesandt  Signal.  In  diesem Fall sind zusätzliche
              Informationen im Signal-Handler verfügbar, falls er mit SA_SIGINFO  installiert  wurde.  arg  wird
              ignoriert.

       F_SETSIG (int)
              Setzt  das  gesandte Signal, wenn Ein- oder Ausgabe möglich wird, auf den in arg angegebenen Wert.
              Ein Wert von Null bedeutet, das Vorgabesignal SIGIO zu senden. Jeder andere  Wert  (einschließlich
              SIGIO) ist das stattdessen zu sendende Signal und in diesem Fall sind zusätzliche Informationen im
              Signal-Handler verfügbar, falls dieser mit SA_SIGINFO installiert wurde.

              Durch Verwendung von F_SETSIG mit einem von Null verschiedenen Wert und Setzen von SA_SIGINFO  für
              den  Signal-Handler  (siehe  sigaction(2))  werden  Zusatzinformationen über E/A-Ereignisse an den
              Handler in einer Struktur siginfo_t übergeben. Falls das Feld si_code  anzeigt,  dass  die  Quelle
              SI_SIGIO  ist,  gibt  das  Feld si_fd den mit diesem Ereignis korrelierten Dateideskriptor zurück.
              Andernfalls gibt es keine Anzeichen, welche Dateideskriptoren wartend sind  und  Sie  sollten  die
              normalen  Mechanismen  (select(2),  poll(2),  read(2) mit gesetztem O_NONBLOCK usw.) verwenden, um
              herauszufinden, welche Dateideskriptoren für E/A verfügbar sind.

              Beachten Sie, dass der in si_fd bereitgestellte Dateideskriptor derjenige ist, der in  der  Aktion
              F_SETSIG   festgelegt   wurde.   Dies   kann  zu  ungewöhnlichen  Grenzfällen  führen.  Falls  der
              Dateideskriptor dupliziert wird  (dup(2)  oder  ähnlich)  und  der  ursprüngliche  Dateideskriptor
              geschlossen  wird,  dann  werden  E/A-Ereignisse  weiterhin generiert aber das Feld si_fd wird die
              Anzahl der jetzt geschlossenen Dateideskriptoren enthalten.

              Durch Auswahl von  Echtzeitsignalen  (Wert  >=  SIGRTMIN),  können  mehrere  E/A-Ereignisse  unter
              Verwendung  der  gleichen  Signalnummer  in  eine  Warteschlange eingereiht werden. (Einreihung in
              Warteschlangen  hängt  vom  verfügbaren  Speicher  ab).  Falls  wie  oben   SA_SIGINFO   für   den
              Signal-Handler gesetzt ist, sind zusätzliche Informationen verfügbar.

              Beachten  Sie,  dass  Linux  eine  Begrenzung für die Anzahl der Echtzeitsignale erzwingt, die für
              einen Prozess in eine Warteschlange eingereiht werden (siehe getrlimit(2)  und  signal(7)).  Falls
              diese  Begrenzung  erreicht  ist,  kehrt  der  Kernel zur Auslieferung von SIGIO zurück und dieses
              Signal wird dem gesamten Prozess statt nur einem bestimmten Thread ausgeliefert.

       Mittels dieser Mechanismen kann ein Programm eine komplett asynchrone E/A implementieren,  ohne  (in  den
       meisten Fällen) select(2) oder poll(2) zu verwenden.

       Die  Verwendung  von  O_ASYNC  ist  für  BSD  und  Linux spezifisch. Die einzige in POSIX.1 spezifizierte
       Verwendung von F_GETOWN and F_SETOWN ist im Zusammenhang  mit  der  Verwendung  des  Signals  SIGURG  bei
       Sockets.  (POSIX spezifiziert das Signal SIGIO nicht). POSIX enthält asynchrone E/A und auch die Struktur
       aio_sigevent, um ähnliche Dinge zu erreichen; diese sind unter Linux auch als Teil  der  GNU-C-Bibliothek
       (Glibc) verfügbar.

   Ausleihe
       F_SETLEASE  und  F_GETLEASE  (Linux 2.4 und neuer) werden dazu verwandt, für die offene Dateideskription,
       auf den der Dateideskriptor fd verweist, eine Ausleihe (»lease«) zu etablieren und die aktuelle  Ausleihe
       zu ermitteln. Ein Datei-Ausleihe stellt einen Mechanismus bereit, durch den ein Prozess, der die Ausleihe
       hält (der »Ausleiher«) über die Auslieferung eines Signals benachrichtigt wird,  wenn  ein  Prozess  (der
       »Ausleihe-Brecher«)  versucht,  die  von  diesem Dateideskriptor referenzierte Datei mit open(2) zu öffen
       oder mit truncate(2) zu verkleinern/vergrößern.

       F_SETLEASE (int)
              Setzt oder entfernt eine Datei-Ausleihe,  abhängig  davon,  welcher  der  folgenden  Wert  in  der
              Ganzzahl arg angegeben ist:

              F_RDLCK
                     Nimmt  eine  Lese-Ausleihe  heraus. Dies führt dazu, dass der aufrufende Prozess informiert
                     wird, wenn die Datei zum Schreiben geöffnet oder  abgeschnitten  wird.  Eine  Lese-Ausleihe
                     kann nur auf einen Dateideskriptor gelegt werden, der nur-lesbar geöffnet ist.

              F_WRLCK
                     Nimmt  eine  Schreibe-Ausleihe  heraus.  Dies  führt  dazu,  dass  der  aufrufende  Prozess
                     informiert wird, wenn die Datei zum Lesen oder Schreiben geöffnet oder abgeschnitten  wird.
                     Eine  Schreibe-Ausleihe  kann  nur  auf  eine  Datei  gelegt werden, falls es keine anderen
                     offenen Dateideskriptoren für diese Datei gibt.

              F_UNLCK
                     Unsere Ausleihe von einer Datei entfernen.

       Ausleihen sind  einem  offenen  Dateideskriptor  zugeordnet  (siehe  open(2)).  Das  bedeutet,  dass  ein
       duplizierter  Dateideskriptor  (zum  Beispiel  durch  fork(2)  oder dup(2) erstellt) sich auf die gleiche
       Ausleihe bezieht und dass diese Ausleihe durch  jeden  dieser  Deskriptoren  verändert  oder  freigegeben
       werden  kann.  Desweiteren  werden  Ausleihen  durch  eine  explizite  Aktion  F_UNLCK  auf  einem dieser
       duplizierten Dateideskriptoren freigegeben oder wenn alle solchen Dateideskriptoren geschlossen wurden.

       Ausleihen dürfen nur für reguläre Dateien herausgenommen werden. Ein nicht  privilegierter  Prozess  darf
       eine  Ausleihe nur für Dateien herausnehmen, deren UID (Eigentümer) auf die Dateisystem-UID des Prozesses
       passt. Ein Prozess mit der Capability CAP_LEASE darf Ausleihen für beliebige Dateien herausnehmen.

       F_GETLEASE (void)
              Zeigt den Typ der Ausleihe, der dem Dateideskriptor fd zugeordnet ist, an, indem entweder F_RDLCK,
              F_WRLCK oder F_UNLCK zurückgeliefert wird, das respektive eine Lese-, Schreib- oder keine Ausleihe
              anzeigt. arg wird ignoriert.

       Wenn ein Prozess (der »Ausleihe-Brecher«) ein open(2) oder truncate(2) durchführt, der mit einer  mittels
       F_SETLEASE  etablierten  Ausleihe in Konflikt steht, wird der Systemaufruf durch den Kernel blockiert und
       der Kernel informiert den Ausleihenden, indem  er  ihm  ein  Signal  (standardmäßig  SIGIO)  sendet.  Der
       Ausleihende  sollte  reagieren,  indem er alle notwendigen Aufräumarbeiten durchführt, um den Zugriff des
       anderen Prozesses auf die Datei vorzubereiten (z.B. das Rausschreiben von zwischengespeicherten Puffern).
       Danach sollte er entweder seine Ausleihe entfernen oder runterstufen. Eine Ausleihe wird durch Ausführung
       des Befehls F_SETLEASE mit der Angabe von arg als F_UNLCK entfernt. Falls der  Ausleihende  derzeit  eine
       Schreib-Ausleihe  auf  die  Datei hält und der Ausleih-Brecher die Datei zum Lesen öffnet, dann reicht es
       aus, wenn der Ausleihende seine  Ausleihe  auf  eine  Lese-Ausleihe  herunterstuft.  Dies  erfolgt  durch
       Ausführung des Befehls F_SETLEASE mit der Angabe von arg als F_RDLCK.

       Falls  der  Ausleihende  nicht  innerhalb  der  in  /proc/sys/fs/lease-break-time festgelegten Anzahl von
       Sekunden seine Ausleihe herunterstuft oder entfernt, entfernt der Kernel die  Ausleihe  des  Ausleihenden
       zwangsweise oder stuft sie zwangsweise herunter.

       Sobald  ein  Ausleih-Brechen  eingeleitet wurde, liefert F_GETLEASE den Ziel-Ausleihtyp (entweder F_RDLCK
       oder F_UNLCK, abhängig davon, was zum  Ausleih-Brecher  kompatibel  wäre)  zurück,  bis  der  Ausleihende
       freiwillig  seine  Ausleihe herunterstuft oder entfernt oder der Kernel dies zwangsweise tut, nachdem die
       Ausleih-Brechzeit abgelaufen ist.

       Sobald die Ausleihe freiwillig oder  zwangsweise  entfernt  oder  heruntergestuft  wurde  und  unter  der
       Annahme,  dass  der  Ausleih-Brecher  nicht  den  Systemaufruf  entblockiert  hat, erlaubt der Kernel dem
       Systemaufruf des Ausleih-Brechers fortzufahren.

       Falls das vom Ausleih-Brecher blockierte open(2) oder truncate(2) durch einen Signal-Handler unterbrochen
       wird,  schlägt der Systemaufruf mit dem Fehler EINTR fehl, aber die anderen Schritte erfolgen dennoch wie
       oben beschrieben. Falls der Ausleih-Brecher durch ein Signal getötet wird, während  er  in  open(2)  oder
       truncate(2)  blockiert  ist,  erfolgen  die  anderen  Schritte  dennoch  wie  oben beschrieben. Falls der
       Ausleih-Brecher den Schalter O_NONBLOCK beim Aufruf von open(2) festgelegt hat, schlägt der Aufruf sofort
       mit dem Fehler EWOULDBLOCK fehl, aber die anderen Schritte erfolgen dennoch wie oben beschrieben.

       Standardmäßig  wird  das  Signal  SIGIO zur Information des Ausleihenden verwandt, dies kann aber mit dem
       Befehl F_SETSIG von fcntl() geändert werden. Falls ein Befehl F_SETSIG ausgeführt wird (selbst einer, der
       SIGIO  festlegt)  und  der  Singal-Handler mittels SA_SIGINFO etabliert wurde, dann wird der Handler eine
       Struktur siginfo_t als sein zweites Argument erhalten und das  Feld  si_fd  dieses  Argumentes  wird  den
       Dateideskriptor der Datei mit der Ausleihe, auf die ein anderer Prozess zugegriffen hat, enthalten. (Dies
       ist nützlich, falls der Aufrufende Ausleihen für mehrere Dateien hält.)

   Datei- und Verzeichnis-Änderungsbenachrichtigung (dnotify)
       F_NOTIFY (int)
              (Seit Linux 2.4) Stellt Benachrichtigungen bereit, wenn das  durch  fd  referenzierte  Verzeichnis
              oder  eine  der  darin  enthaltenen  Dateien geändert wird. Die Ereignisse, für die benachrichtigt
              wird, werden in arg festgelegt. Dies ist eine Bitmaske, in der mittels ODER eines oder mehrere der
              folgenden Bits festgelegt sind:

              DN_ACCESS   Ein Dateizugriff erfolgte (read(2), pread(2), readv(2) und ähnliche)
              DN_MODIFY   Eine  Datei wurde verändert (write(2), pwrite(2), writev(2), truncate(2), ftruncate(2)
                          und ähnliche).
              DN_CREATE   Eine Datei wurde erstellt (open(2), creat(2), mknod(2), mkdir(2), link(2), symlink(2),
                          rename(2) in dieses Verzeichnis).
              DN_DELETE   Der  Link  auf  eine  Datei  wurde  entfernt  (unlink(2),  rename(2)  in  ein  anderes
                          Verzeichnis, rmdir(2)).
              DN_RENAME   Eine Datei wurde innerhalb dieses Verzeichnis umbenannt (rename(2)).
              DN_ATTRIB   Die Attribute einer Datei wurden geändert (chown(2), chmod(2), utime(2),  utimensat(2)
                          und ähnliche).

              (Um  diese  Definitionen  zu  erhalten, muss das Feature-Test-Makro _GNU_SOURCE vor der Einbindung
              irgendeiner Header-Datei definiert werden.)

              Verzeichnisbenachrichtigungen sind normalerweise »einmalig« und die  Anwendung  muss  sich  erneut
              registrieren,  um  weitere  Benachrichtigungen  zu  erhalten.  Wird alternativ DN_MULTISHOT in arg
              aufgenommen, bleiben die Benachrichtigungen aktiv, bis sie explizit entfernt werden.

              Eine Reihe von F_NOTIFY-Anfragen ist kumulativ, bei der die Ereignisse in arg  zu  der  Menge  der
              bereits   beobachteten   hinzugefügt   werden.   Um  Benachrichtigungen  für  alle  Ereignisse  zu
              deaktivieren, führen Sie einen Aufruf F_NOTIFY mit arg als 0 durch.

              Benachrichtigungen erfolgen über die Zustellung eines Signals. Das Standardsignal ist SIGIO,  dies
              kann  aber  mittels  des  Befehls  F_SETSIG von fcntl() geändert werden. (Beachten Sie, dass SIGIO
              eines der nichtwarteschlangenfähigen Standardsignale ist;  wird  auf  Echtzeitsignale  umgestellt,
              können  mehrere  Benachrichtigungen  für  den  Prozess  in  die Warteschlange gestellt werden). Im
              letzteren Falle erhält der Signal-Handler eine Struktur siginfo_t als zweites Argument (falls  der
              Hanndler  mittels  SA_SIGINFO  etabliert  wurde)  und das Feld si_fd dieser Struktur enthält einen
              Dateideskriptor, der  die  Benachrichtigung  erstellte  (nützlich,  falls  Benachrichtigungen  für
              mehrere Verzeichnisse eingerichtet werden).

              Insbesondere   bei   der   Verwendung   von   DN_MULTISHOT   sollte  ein  Echtzeitsignal  für  die
              Benachrichtigung  verwandt  werden,  so  dass  mehrere  Benachrichtigungen  in  die  Warteschlange
              aufgenommen werden können.

              HINWEIS:  Neue  Anwendungen  sollten  die  Schnittstelle  inotify  (verfügbar  seit Kernel 2.6.13)
              verwenden, die eine deutlich überlegene Schnittstelle zur Ermittlung von  Benachrichtigungen  über
              Dateisystemereignisse bietet. Siehe inotify(7).

   Ändern der Kapazität einer Pipe
       F_SETPIPE_SZ (int; seit Linux 2.6.35)
              Ändert   die   Kapazität   der   durch  fd  referenzierten  Pipe  auf  mindestens  arg  Byte.  Ein
              unprivilegierter Prozess kann die Pipe-Kapazität auf jeden Wert zwischen der Systemseitengröße und
              der  durch  /proc/sys/fs/pipe-max-size (siehe proc(5)) definierten Grenze anpassen. Wird versucht,
              die Pipe-Kapazität unter die Seitengröße zu setzen, dann  wird  diese  ohne  Rückmeldung  auf  die
              Seitengröße  gerundet.  Versucht  ein  unprivilegierter  Prozess,  die  Pipe-Kapazität über die in
              /proc/sys/fs/pipe-max-size definierte Grenze zu setzen,  führt  dies  zu  dem  Fehler  EPERM;  ein
              privilegierter Prozess (CAP_SYS_RESOURCE) kann die Grenze außer Kraft setzen.

              Beim  Reservieren  des  Puffers  für  die  Pipe  darf  der  Kernel  eine größere Kapazität als arg
              verwenden, falls das für die Implementierung passend ist. (In der  aktuellen  Implementierung  ist
              die  Allokation  die  nächst-größere Zweierpotenz des Vielfachen der Seitengröße der angeforderten
              Größe.)  Die  tatsächliche  gesetzte  Kapazität  (in  Byte)  wird  als   Ergebnis   der   Funktion
              zurückgeliefert.

              Wird  versucht,  die  Pipe-Kapazität  auf  einen  Wert  zu setzen, der kleiner als der derzeit zum
              Speichern von Daten verwandte Pufferbereich ist, dann wird der Fehler EBUSY erzeugt.

       F_GETPIPE_SZ (void; seit Linux 2.6.35)
              Liefert (als Ergebnis der Funktion) die Kapazität der durch fd referenzierten Pipe zurück.

   Versiegelung von Dateien
       Dateisiegel begrenzen die Menge der erlaubten Aktionen für eine bestimmte Datei. Für jedes auf eine Datei
       angebrachte  Siegel  wird  von jetzt an eine bestimmte Gruppe an Aktionen auf dieser Datei mit dem Fehler
       EPERM fehlschlagen. Die Datei wird als versiegelt bezeichnet. Die Vorgabemenge der Siegel hängt  von  der
       Art  der  unterliegenden  Datei und dem Dateisystem ab. Für einen Überblick über Dateiversiegelung, einer
       Diskussion ihres Zwecks und Code-Beispiele siehe memfd_create(2).

       Derzeit können Dateisiegel nur auf durch  memfd_create(2)  zurückgelieferte  Dateideskriptoren  angewandt
       werden (falls MFD_ALLOW_SEALING eingesetzt wurde). Auf anderen Dateisystemen werden alle fcntl()-Aktionen
       zur Versiegelung EINVAL zurückliefern.

       Siegel sind eine Eigenschaft eines Inodes. Daher verfügen alle offenen  Dateideskriptoren,  die  auf  den
       gleichen Inode verweisen, über die gleiche Gruppe an Siegeln. Desweiteren können Siegel nie entfernt, nur
       hinzugefügt werden.

       F_ADD_SEALS (int; seit Linux 3.17)
              Fügt die im Bitmasken-Argument arg übergebenen Siegel zu der Gruppe der Siegel des Inodes, der vom
              Dateideskriptor  fd  referenziert  wird,  hinzu.  Siegel können nicht mehr entfernt werden. Sobald
              dieser Aufruf gelingt, werden die Siegel sofort vom  Kernel  durchgesetzt.  Falls  die  derzeitige
              Gruppe  der  Siegel  F_SEAL_SEAL  enthält  (siehe  unten)  wird dieser Aufruf mit EPERM abgelehnt.
              Hinzufügen eines bereits gesetzten Siegels ist eine Nullaktion, falls  F_SEAL_SEAL  nicht  bereits
              gesetzt ist. Um ein Siegel zu setzen, muss der Dateideskriptor fd schreibbar sein.

       F_GET_SEALS (void; seit Linux 3.17)
              Liefert  (als  Funktionsergebnis) die aktuelle Menge der Siegel des durch fd referenzierten Inodes
              zurück. Falls keine Siegel gesetzt sind, wird 0  zurückgeliefert.  Falls  die  Datei  Versiegelung
              nicht unterstützt, wird -1 zurückgeliefert und errno auf EINVAL gesetzt.

       Die folgenden Versiegelungen sind verfügbar:

       F_SEAL_SEAL
              Falls  dieses Siegel gesetzt ist, wird jeder zukünftige Aufruf von fcntl() mit F_ADD_SEALS mit dem
              Fehler EPERM fehlschlagen. Daher verhindert dieses Siegel jede Änderung an der Siegelmenge selbst.
              Falls  die  ursprüngliche  Siegelmenge  einer  Datei F_SEAL_SEAL enthält, dann führt dies effektiv
              dazu, dass die Siegelmenge konstant und gesperrt ist.

       F_SEAL_SHRINK
              Falls dieses Siegel gesetzt ist, kann die in Frage kommende Datei nicht verkleinert  werden.  Dies
              betrifft  open(2)  mit  dem  Schalter  O_TRUNC  sowie  truncate(2) und ftruncate(2). Diese Aufrufe
              schlagen mit EPERM fehl, falls  Sie  versuchen,  die  in  Frage  kommende  Datei  zu  verkleinern.
              Vergrößern der Datei ist weiterhin möglich.

       F_SEAL_GROW
              Falls  dieses  Siegel  gesetzt ist, kann die in Frage kommende Datei nicht vergrößert werden. Dies
              betrifft write(2) über das Ende der Datei  hinaus,  truncate(2),  ftruncate(2)  und  fallocate(2).
              Diese  Aufrufe  schlagen  mit  EPERM  fehl, falls Sie versuchen, diese zum Vergrößern der Datei zu
              verwenden. Falls Sie die Dateigröße beibehalten oder verkleinern, werden diese  Aufrufe  weiterhin
              wie erwartet funktionieren.

       F_SEAL_WRITE
              If  this  seal  is set, you cannot modify the contents of the file. Note that shrinking or growing
              the size of the file is  still  possible  and  allowed.  Thus,  this  seal  is  normally  used  in
              combination  with  one  of the other seals. This seal affects write(2)  and fallocate(2)  (only in
              combination with the FALLOC_FL_PUNCH_HOLE flag). Those calls fail with EPERM if this seal is  set.
              Furthermore,  trying  to  create  new shared, writable memory-mappings via mmap(2)  will also fail
              with EPERM.

              Using the F_ADD_SEALS operation to set the F_SEAL_WRITE seal fails with  EBUSY  if  any  writable,
              shared  mapping  exists. Such mappings must be unmapped before you can add this seal. Furthermore,
              if there are any asynchronous I/O operations (io_submit(2))  pending on the file, all  outstanding
              writes will be discarded.

   Datei Lese-/Schreibehinweise
       Der   Kernel   kann   mit   Schreib-Lebenszeithinweisen   über  die  erwartete  relative  Lebenszeit  von
       Schreiboperationen an einer benannten Inode oder über eine bestimmte offene  Dateideskription  informiert
       werden  (Siehe  open(2)  für eine Erläuterung von offenen Dateideskriptoren.). In diesem Kontext bedeutet
       der Ausdruck »Schreib-Lebenszeit«, die erwartete Zeit, die die Daten auf dem Medium verbleiben, bevor sie
       überschrieben oder gelöscht werden.

       Eine   Anwendung   darf   die   unten   festgelegten   verschiedenen   Hinweisewerte  verwenden,  um  die
       Schreiboperationen in verschiedene Schreibklassen zu trennen, so dass mehrere Benutzer oder  Anwendungen,
       die  mit dem gleichen Speicher-Backend arbeiten, ihre E/A-Muster in einer konsistenten Art zusammenfassen
       können. Allerdings implizieren diese Schalter keine funktionalen Semantiken und verschiedene  E/A-Klassen
       können  die  Schreib-Lebenszeithinweise  in  beliebigen  Arten benutzen, so lange die Hinweise konsistent
       benutzt werden.

       Die folgenden Aktionen könen auf den Dateideskriptor fd angewandt werden:

       F_GET_RW_HINT (uint64_t *; seit Linux 4.13)
              Liefert den Wert des Lese-/Schreibhinweises, der der durch fd referenzierten unterliegenden  Inode
              zugeordnet ist.

       F_SET_RW_HINT (uint64_t *; seit Linux 4.13)
              Setzt  den  Wert  des Lese-/Schreibhinweises, der der durch fd referenzierten unterliegenden Inode
              zugeordnet ist. Dieser Hinweis verbleibt, bis er entweder explizit geändert oder das unterliegende
              Dateisystem ausgehängt wird.

       F_GET_FILE_RW_HINT (uint64_t *; seit Linux 4.13)
              Liefert   den   Wert   des   Lese-/Schreibhinweises,  der  der  durch  fd  referenzierten  offenen
              Dateideskription zugeordnet ist.

       F_SET_FILE_RW_HINT (uint64_t *; seit Linux 4.13)
              Setzt  den  Wert  des  Lese-/Schreibhinweises,   der   der   durch   fd   referenzierten   offenen
              Dateideskription zugeordnet ist.

       Falls  einer  offenen Dateideskription noch kein Lese-/Schreibhinweis zugeordnet wurde, dann soll der der
       Inode zugeordnete Wert verwandt werden, falls vorhanden.

       Die folgenden Lese-/Schreibhinweise sind seit Linux 4.13 gültig:

       RWH_WRITE_LIFE_NOT_SET
              Es  wurde kein spezieller Hinweis gesetzt. Dies ist der Vorgabewert.

       RWH_WRITE_LIFE_NONE
              Kein spezielle Schreib-Lebenszeit ist dieser Datei oder diesem Inode zugeordnet.

       RWH_WRITE_LIFE_SHORT
              Es wird erwartet, dass Daten,  die  in  diese  Inode  oder  über  diesen  offenen  Dateideskriptor
              geschrieben werden, eine kurze Lebenszeit haben werden.

       RWH_WRITE_LIFE_MEDIUM
              Es  wird  erwartet,  dass  Daten,  die  in  diese  Inode  oder über diesen offenen Dateideskriptor
              geschrieben werden, eine längere Lebenszeit als Daten, die  mit  RWH_WRITE_LIFE_SHORT  geschrieben
              wurden, haben werden.

       RWH_WRITE_LIFE_LONG
              Es  wird  erwartet,  dass  Daten,  die  in  diese  Inode  oder über diesen offenen Dateideskriptor
              geschrieben werden, eine längere Lebenszeit als Daten, die mit  RWH_WRITE_LIFE_MEDIUM  geschrieben
              wurden, haben werden.

       RWH_WRITE_LIFE_EXTREME
              Es  wird  erwartet,  dass  Daten,  die  in  diese  Inode  oder über diesen offenen Dateideskriptor
              geschrieben werden, eine längere Lebenszeit als Daten,  die  mit  RWH_WRITE_LIFE_LONG  geschrieben
              wurden, haben werden.

       Alle  schreibspezifischen  Hinweise  sind relativ zueinander und ihnen sollte keine individuelle absolute
       Bedeutung beigemessen werden.

RÜCKGABEWERT

       Die Rückgabewerte sind abhängig von der ausgeführten Operation:

       F_DUPFD  Der neue Dateideskriptor.

       F_GETFD  Wert des File-Deskriptor-Schalters.

       F_GETFL  Wert der Dateistatusschalter.

       F_GETLEASE
                Art der Ausleihe, die auf dem Dateideskriptor gehalten wird.

       F_GETOWN Wert des Dateideskriptor-Eigentümers.

       F_GETSIG Wert des Signals,  wenn  Lesen  oder  Schreiben  möglich  wird,  oder  Null  für  traditionelles
                SIGIO-Verhalten.

       F_GETPIPE_SZ, F_SETPIPE_SZ
                Die Kapazität der Pipe.

       F_GET_SEALS
                Eine  Bitmaske,  die die Siegel identifiziert, die für den durch fd referenzierten Inode gesetzt
                wurden.

       Alle anderen Befehle
                Null.

       Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.

FEHLER

       EACCES oder EAGAIN
              Aktion wird durch von anderen Prozessen gehaltene Sperren verhindert.

       EAGAIN The operation is prohibited because the file has been memory-mapped by another process.

       EBADF  fd ist kein offener Dateideskriptor.

       EBADF  cmd ist F_SETLK oder F_SETLKW und der Öffnungsmodus  des  Dateideskriptors  passt  nicht  auf  die
              angeforderte Art der Sperre.

       EBUSY  cmd  ist F_SETPIPE_SZ und die in arg festgelegte neue Kapazität der Pipe ist kleiner als die Größe
              des derzeit zur Speicherung von Daten in der Pipe verwandten Pufferspeichers.

       EBUSY  cmd is F_ADD_SEALS, arg includes F_SEAL_WRITE, and there exists a writable, shared mapping on  the
              file referred to by fd.

       EDEADLK
              Es wurde erkannt, dass der angegebene Befehl F_SETLKW zu einer Verklemmung führen würde.

       EFAULT lock befindet sich außerhalb Ihres adressierbaren Adressraums.

       EINTR  cmd  ist  F_SETLKW  oder  F_OFD_SETLKW  und  die Aktion wurde durch ein Signal unterbrochen; siehe
              signal(7).

       EINTR  cmd ist F_GETLK, F_SETLK, F_OFD_GETLK oder F_OFD_SETLK und  die  Aktion  wurde  durch  ein  Signal
              unterbrochen, bevor die Sperre geprüft oder erworben werden konnte. Passiert am wahrscheinlichsten
              beim Sperren von Dateien in der Ferne (d.h. Sperren über  NFS),  kann  aber  manchmal  auch  lokal
              auftreten.

       EINVAL Der in cmd angegebene Wert wird von diesem Kernel nicht erkannt.

       EINVAL cmd ist F_ADD_SEALS und arg enthält ein nicht erkanntes Versiegelungs-Bit.

       EINVAL cmd  ist  F_ADD_SEALS  oder F_GET_SEALS und das Dateisystem, das den durch fd referenzierten Inode
              enthält, unterstützt kein Versiegeln.

       EINVAL cmd ist F_DUPFD und arg ist negativ oder ist größer als der  maximal  zulässige  Wert  (siehe  die
              Diskussion von RLIMIT_NOFILE in getrlimit(2)).

       EINVAL cmd ist F_SETSIG und arg ist keine erlaubbare Signalnummer.

       EINVAL cmd ist F_OFD_SETLK, F_OFD_SETLKW oder F_OFD_GETLK und l_pid wurde nicht als Null angegeben.

       EMFILE cmd  ist  F_DUPFD  und die Beschränkung pro Prozess für die Anzahl offener Dateideskriptoren wurde
              erreicht.

       ENOLCK Zu viele Segment-Sperren offen, die Sperr-Tabelle ist voll oder ein Sperrprotokoll aus  der  Ferne
              schlug fehl (z.B. Sperren über NFS).

       ENOTDIR
              F_NOTIFY wurde in cmd angegeben, aber fd zeigt nicht auf ein Verzeichnis.

       EPERM  cmd  ist  F_SETPIPE_SZ  und die weiche oder harte Benutzer-Pipe-Beschränkung wurde erreicht; siehe
              pipe(7).

       EPERM  Es wurde versucht, den Schalter O_APPEND auf einer Datei zurückzusetzen, bei der das Attribut »nur
              anhängen« gesetzt ist.

       EPERM  cmd  war  F_ADD_SEALS aber fd war nicht zum Schreiben offen oder die aktuelle Menge der Siegel der
              Datei enthält bereits F_SEAL_SEAL.

KONFORM ZU

       SVr4, 4.3BSD, POSIX.1-2001. Nur die Operationen F_DUPFD, F_GETFD,  F_SETFD,  F_GETFL,  F_SETFL,  F_GETLK,
       F_SETLK und F_SETLKW sind in POSIX.1-2001 spezifiziert.

       F_GETOWN  und  F_SETOWN  sind in POSIX.1-2001 spezifiziert. (Um Ihre Definitionen zu erhalten, definieren
       Sie entweder _XOPEN_SOURCE mit einem Wert größer oder gleich 500 oder definieren Sie _POSIX_C_SOURCE  mit
       einem Wert größer oder gleich 200809L.)

       F_DUPFD_CLOEXEC  ist  in  POSIX.1-2001  spezifiziert.  (Um diese Definitionen zu erhalten, definieren Sie
       _POSIX_C_SOURCE mit einem Wert größer oder gleich 200809L oder _XOPEN_SOURCE mit einem Wert  größer  oder
       gleich 700.)

       F_GETOWN_EX,  F_SETOWN_EX,  F_SETPIPE_SZ,  F_GETPIPE_SZ,  F_GETSIG,  F_SETSIG,  F_NOTIFY,  F_GETLEASE und
       F_SETLEASE sind Linux-spezifisch. (Definieren  Sie  das  Makro  _GNU_SOURCE,  um  diese  Definitionen  zu
       erhalten.)

       F_OFD_SETLK,  F_OFD_SETLKW  und F_OFD_GETLK sind Linux-spezifisch (und _GNU_SOURCE muss definiert werden,
       um ihre Definitionen zu erhalten). Es wird aber daran gearbeitet, dass sie in der  nächsten  Version  von
       POSIX.1 enthalten sind.

       F_ADD_SEALS und F_GET_SEALS sind Linux-spezifisch.

ANMERKUNGEN

       Die Fehler, die von dup2(2) zurückgegeben werden, sind anders als die von F_DUPFD.

   Sperrung von Dateien
       Der ursprüngliche Systemaufruf fcntl() von Linux war nicht dafür konstruiert, große Dateiversätze (in der
       Struktur  flock)  zu  handhaben.  Konsequenterweise  wurde  ein  Systemaufruf  fcntl64()  in  Linux   2.4
       hinzugefügt.  Dieser neuere Systemaufruf setzt eine andere Struktur zum Sperren von Dateien ein, flock64,
       und entsprechende Befehle F_GETLK64, F_SETLK64  und  F_SETLKW64.  Diese  Details  können  allerdings  von
       Anwendungen,  die  Glibc  einsetzen,  ignoriert werden, da dessen Wrapperfunktion fcntl() transparent den
       neueren Systemaufruf einsetzt, wo er verfügbar ist.

   Datensatzsperren
       Seit Kernel 2.0  gibt  es  keine  Wechselwirkung  zwischen  den  durch  flock(2)  und  fcntl()  gesetzten
       Sperrtypen.

       Bei  einer  Reihe von Systemen gibt es in struct flock weitere Felder wie z.B. l_sysid. Es ist klar, dass
       l_pid alleine nicht sehr nützlich ist, falls der Prozess, der die Sperre hält, auf einer anderen Maschine
       existiert.

       Der ursprüngliche Systemaufruf fcntl() von Linux war nicht dafür konstruiert, große Dateiversätze (in der
       Struktur  flock)  zu  handhaben.  Konsequenterweise  wurde  ein  Systemaufruf  fcntl64()  in  Linux   2.4
       hinzugefügt.  Dieser neuere Systemaufruf setzt eine andere Struktur zum Sperren von Dateien ein, flock64,
       und entsprechende Befehle F_GETLK64, F_SETLK64  und  F_SETLKW64.  Diese  Details  können  allerdings  von
       Anwendungen,  die  Glibc  einsetzen,  ignoriert werden, da dessen Wrapperfunktion fcntl() transparent den
       neueren Systemaufruf einsetzt, wo er verfügbar ist.

   Datensatzsperren und NFS
       Falls ein NFSv4-Client vor Linux  3.12  den  Kontakt  mit  dem  Server  für  eine  bestimmte  Zeitperiode
       (definiert  als  mehr  als  90  Sekunden  ohne Kommunikation) verlor, konnte er eine Sperre verlieren und
       wieder erlangen, ohne von dieser Tatsache Kenntnis zu erhalten. (Die Zeitperiode, nach  der  der  Kontakt
       als  verloren  angesehen  wird,  ist als NFSv4-Ausleihzeit bekannt. Auf einem Linux-NFS-Server kann diese
       durch einen Blick in /proc/fs/nfsd/nfsv4leasetime, die diese  Periode  in  Sekunden  ausdrückt,  bestimmt
       werden.  Der  Vorgabewert für diese Datei ist 90.) In diesem Szenario sind potenziell Datenbeschädigungen
       möglich, da ein anderer Prozess in der  Zwischenzeit  eine  Sperre  erlangen  und  Datei-E/A  durchführen
       könnte.

       Wenn  seit  Linux 3.12 ein NFSv4-Client den Kontakt mit dem Server verliert, wird jede E/A des Prozesses,
       der »glaubt«, er halte eine Sperre, fehlschlagen, bis  dieser  Prozess  die  Datei  schließt  und  erneut
       öffnet. Ein Kernelparameter (nfs.recover_lost_locks) kann auf 1 gesetzt werden, um das pre-3.12-Verhalten
       zu erreichen, bei dem ein Client versuchen wird, verloren gegangene Sperren wiederherzustellen, wenn  der
       Kontakt  mit  dem Server wieder etabliert ist. Aufgrund des vorhandenen Risikos der Datenverfälschung ist
       die Vorgabe für diesen Parameter 0 (deaktiviert).

FEHLER

   F_SETFL
       Es ist nicht möglich, F_SETFL zum Ändern des Zustands der  Schalter  O_DSYNC  und  O_SYNC  zu  verwenden.
       Versuche, den Zustand dieser Schalter zu ändern, werden ohne Meldung ignoriert.

   F_GETOWN
       Eine   Begrenzung  der  Linux-Systemaufrufkonventionen  auf  einigen  Architekturen  (insbesondere  i386)
       bedeutet, dass, falls eine von F_GETOWN zurückgelieferte (negative) Prozessgruppen-ID in den  Bereich  -1
       bis  -4095  fällt,  dies  von Glibc fälschlicherweise als Fehler im Systemaufruf interpretiert wird. Dann
       wird der Rückgabewert von fcntl() -1 sein und errno wird die (positive) Prozessgruppen-ID enthalten.  Die
       Linux-spezifische  Aktion  F_GETOWN_EX  vermeidet dieses Problem. Seit Glibc Version 2.11 versteckt Glibc
       das Kernelproblem F_GETOWN, indem F_GETOWN mittels F_GETOWN_EX implementiert wird.

   F_SETOWN
       Unter Linux 2.4 und älter gibt es einen Fehler, der auftreten kann,  wenn  ein  unprivilegierter  Prozess
       statt  einem  Aufrufenden  F_SETOWN  verwendet,  um  den  Eigentümer  eines  Socket-Dateideskriptors  als
       Prozess(gruppe) festzulegen. In diesem Fall kann fcntl() -1 mit errno auf  EPERM  gesetzt  zurückliefern,
       selbst  wenn  der/die  Eigentümerprozess(gruppe)  dergestalt ist, dass der Aufrufende Rechte hat, ihr/ihm
       Signale zu senden. Trotz dieses zurückgelieferten Fehlers wird der Dateieigentümer  gesetzt  und  Signale
       werden zum Eigentümer gesandt.

   Erkennung von Verklemmungen
       Der  vom  Kernel  eingesetzte  Algorithmus  zur Erkennung von Verklemmungen beim Umgang mit F_SETLKW kann
       sowohl falsch-negative (keine Erkennung von Verklemmungen, eine Gruppe von verklemmten  Prozessen  bleibt
       unbegrenzt  blockiert)  als  auch  falsch-positive  (EDEADLK-Fehler  obwohl  keine  Verklemmung vorliegt)
       liefern. Beispielsweise begrenzt der Kernel die Sperrtiefe seiner Abhängigkeitssuche auf 10 Schritte, was
       bedeutet,  dass  zirkulare  Verklemmungsketten,  die  diese  Größe  überschreiten,  nicht erkannt werden.
       Zusätzlich kann der Kernel fälschlicherweise eine Verklemmung erkennen, wenn zwei oder mehr Prozesse, die
       mit  dem  Schalter  CLONE_FILES  von  clone(2)  Sperren  setzen, die (dem Kernel) als im Konflikt stehend
       erscheinen.

   Pflichtsperren
       Die  Linux-Implementierung  von  Pflichtsperren  ist  Gegenstand  von   Ressourcenwettläufen,   die   sie
       unzuverlässig machen: Ein write(2)-Aufruf, der sich mit einer Sperre überschneidet, kann Daten verändern,
       nachdem die Pflichtsperre erlangt wurde. Ein read(2)-Aufruf, der sich  mit  einer  Sperre  überschneidet,
       kann Änderungen an Daten entdecken, die nur vorgenommen wurden, nachdem eine Schreibsperre erlangt wurde.
       Ähnliche Wettläufe gibt es zwischen Pflichtsperren und mmap(2). Daher ist es nicht zu empfehlen, sich auf
       Pflichtsperren zu verlassen.

SIEHE AUCH

       dup2(2), flock(2), open(2), socket(2), lockf(3), capabilities(7), feature_test_macros(7), lslocks(8)

       locks.txt,    mandatory-locking.txt    und    dnotify.txt    in   dem   Linux-Kernelquelldateiverzeichnis
       Documentation/filesystems/. (Bei älteren Kerneln befinden sich diese Dateien direkt unter dem Verzeichnis
       Documentation/ und mandatory-locking.txt heißt mandatory.txt.)

KOLOPHON

       Diese  Seite  ist  Teil  der  Veröffentlichung  4.15  des Projekts Linux-man-pages. Eine Beschreibung des
       Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden
       sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die  deutsche  Übersetzung  dieser  Handbuchseite  wurde  von  Martin  Schulze <joey@infodrom.org>, Helge
       Kreutzmann <debian@helgefjell.de> und Chris Leick <c.leick@vollbio.de> erstellt.

       Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder  neuer
       bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

       Wenn  Sie  Fehler  in  der  Übersetzung  dieser  Handbuchseite  finden, schicken Sie bitte eine E-Mail an
       <debian-l10n-german@lists.debian.org>.