Provided by: manpages-de-dev_0.10-1_all bug

BEZEICHNUNG

       fcntl - Manipulation von Dateideskriptoren

       Diese  Handbuchseite ist eventuell veraltet. Im Zweifelsfall ziehen Sie
       die englischsprachige Handbuchseite zu Rate, indem Sie

              man -LC 2 fcntl

       eingeben.

SYNOPSIS

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

       int fcntl(int fd, int cmd);
       int fcntl(int fd, int cmd, long arg);
       int fcntl(int fd, int cmd, struct flock *lock);

DESCRIPTION

       fcntl fuhrt eine von vielen unterschiedlichen Operationen auf dem File-
       Deskriptor  fd  aus.   Die jeweilige Operation wird durch den Parameter
       cmd angegeben.

   SchlieBen beim Ausf"uhren (close-on-exec)
       F_DUPFD
              Sucht den verfugbaren File-Deskriptor mit der niedrigsten Nummer
              groBer  oder  gleich arg und legt in fd eine Kopie davon an.  Im
              Gegensatz  dazu  verwendet   dup2(2)   exakt   den   angegebenen
              Deskriptor.

              Die  alten  und  neuen  Deskriptoren konnen ausgetauscht werden.
              Sie verwenden beide  die  gleichen  Locks,  Positionszeiger  und
              Flags.    Wenn   beispielsweise   die  Dateiposition  des  einen
              Deskriptors mit lseek geandert wird, dann ist  sie  gleichzeitig
              auch beim anderen Deskriptor geandert.

              Die  beiden  Deskriptoren teilen sich jedoch nicht das close-on-
              exec-Flag.  In der Kopie ist das Flag abgeschaltet, so dass  der
              neue Deskriptor beim Ausfuhren nicht geschlossen wird.

              Bei Erfolg wird der neue Deskriptor zuruckgegeben.

       F_GETFD
              Liest  das  close-on-exec-Flag.   Ist  das  FD_CLOEXEC-Bit 0, so
              bleibt die Datei bei einem exec  geoffnet,  ansonsten  wird  sie
              geschlossen.

       F_SETFD
              Setzt  das  close-on-exec-Flag auf den Wert, des FD_CLOEXEC-Bits
              in arg.

   Die Statusflags einer Datei
       Jedem File-Deskriptor sind  verschiedene  Flags  zugeordnet,  die  beim
       Aufruf  von  open(2)  initialisiert und spater durch fcntl(2) verandert
       werden konnen.  Kopien eines File-Deskriptors,  die  mit  dup2(2)  oder
       fork(2), etc. erzeugt wurden, besitzen identische Flags.

       Die einzelnen Flags und ihre Bedeutung sind in open(2) beschrieben.

       F_GETFL
              Liest die Flags des Deskriptors.

       F_SETFL
              Setzt  die  Flags  des Deskriptors, die sich auf den Dateistatus
              beziehen, auf die in arg angegebenen Werte.  Die  weiteren  Bits
              fur  Zugriffsmodus  und  Dateierzeugung werden ignoriert.  Unter
              Linux lassen sich  auf  diese  Weise  nur  die  Flags  O_APPEND,
              O_NONBLOCK, O_ASYNC und O_DIRECT verandern.

   Empfehlendes (advisory) Locking
       Man benutzt
              F_GETLK,  F_SETLK  und F_SETLKW, um Locks fur bestimmte Segmente
              in einer Datei anzufordern,  aufzugeben  oder  zu  testen.   Das
              dritte  Argument  lock verweist auf eine Struktur, die zumindest
              die  folgenden  Eintrage  enthalt  (die  Reihenfolge  ist  nicht
              festgelegt):

                struct flock {
                    ...
                    short l_type;    /* Typ des Locks: F_RDLCK,
                                        F_WRLCK, F_UNLCK */
                    short l_whence;  /* Wie ist l_start zu verstehen:
                                        SEEK_SET, SEEK_CUR, SEEK_END */
                    off_t l_start;   /* Startposition des Locks */
                    off_t l_len;     /* Lock fur l_len Bytes anfordern */
                    pid_t l_pid;     /* PID des Prozesses, der das Lock blockiert
                                        (nur F_GETLK) */
                    ...
                };

       Die  Eintrage  l_whence,  l_start, und l_len bestimmen den Bereich, fur
       den das Lock angefordert werden soll.   l_start  gibt  den  Anfang  des
       Bereichs  an, und zwar relativ zum Anfang der Datei (falls l_whence auf
       SEEK_SET gesetzt ist), relativ zur  aktuellen  Position  in  der  Datei
       (falls  l_whence  auf SEEK_CUR gesetzt ist), bzw. relativ zum Dateiende
       (falls l_whence auf SEEK_END  gesetzt  ist).   In  den  beiden  zuletzt
       genannten  Fallen  kann  l_start  auch  negativ sein, sofern es dadurch
       nicht uber den Beginn der Datei hinaus verweist.  Das Lock wird fur die
       in  l_len  angegebene  Anzahl  von  Bytes  angefordert.  Sie darf nicht
       negativ sein.  (Man beachte jedoch auch die  ANMERKUNGEN  unten.)   Der
       Bereich  darf  uber  das  Dateiende  hinausweisen,  nicht  aber vor den
       Dateianfang.  Der Wert 0 hat eine spezielle Bedeutung:  So fordert  man
       ein  Lock an, das an der durch l_whence und l_start bestimmten Position
       beginnt und bis zum Dateiende reicht, gleichgultig auf welche GroBe die
       Datei noch anwachst.

       Der  Eintrag  l_type  wird  benutzt,  um entweder ein Lock fur lesenden
       (F_RDLCK)  oder  schreibenden   (F_WDLCK)   Zugriff   auf   die   Datei
       anzufordern.   Beliebig  viele  Prozesse  durfen  ein  Lock  zum  Lesen
       besitzen (geteiltes Lock), aber nur ein Prozess gleichzeitig  darf  ein
       Lock    zum    Schreiben    erhalten   (ausschlieBendes   Lock).    Ein
       ausschlieBendes Lock schlieBt samtliche anderen Locks aus, also  sowohl
       lesende,  als  auch andere schreibende.  Ein einzelner Prozess darf fur
       ein bestimmtes Dateisegment nur einen einzigen Typ von  Lock  besitzen;
       wird  ein neues Lock fur einen Bereich angefordert, fur den bereits ein
       anderes Lock existiert, so wird das bestehende Lock  auf  den  Typ  des
       neuen  Locks  umgestellt.  (Stimmen die Bereiche der beiden Locks nicht
       exakt uberein, konnen sie  dadurch  aufgeteilt,  verkleinert  oder  mit
       anderen Locks vereinigt werden.)

       F_SETLK
              Fordert ein Lock an, falls l_type auf F_RDLCKoderF_WRLCK gesetzt
              ist.  Gibt ein Lock auf, falls l_type auf F_UNLCK  gesetzt  ist.
              Der  angeforderte  Bereich  wird  durch  die  Eintrage l_whence,
              l_start und l_len in lock angegeben.  Falls ein anderer  Prozess
              ein  konkurrierendes Lock halt, gibt dieser Aufruf -1 zuruck und
              setzt errno auf EACCESS oder EAGAIN.

       F_SETLKW
              Unterscheidet sich  nur  dann  von  F_SETLK,  wenn  ein  anderer
              Prozess  ein  konkurrierendes  Lock halt.  In diesem Fall wartet
              F_SETLKW auf die Freigabe.  Der Aufruf  kann  durch  ein  Signal
              unterbrochen  werden.   Dann  wird  zunachst  der  Signalhandler
              abgearbeitet.  Direkt im Anschluss wird fcntl() mit Ruckgabewert
              -1 beendet und errno auf EINTR gesetzt.

       F_GETLK
              Beim  Aufruf  beschreibt  lock  ein  zu  testendes Lock auf eine
              Datei.  Konnte es erfolgreich gesetzt werden, so  setzt  fcntl()
              den  Eintrag  l_type  in  lock auf F_UNLCK und lasst die ubrigen
              Felder   unverandert.    Sind   bereits   ein    oder    mehrere
              konkurrierende   Locks   gesetzt,   werden  die  Felder  l_type,
              l_whence, l_start und l_len in lock mit Informationen uber eines
              der  Locks  gefullt.   Die PID des zugehorigen Prozesses wird in
              l_pid zuruckgegeben.

       Um ein Lock fur Lesezugriff anzufordern, muss der Deskriptor zum  Lesen
       geoffnet  sein.   Ein  Lock  fur  Schreibzugriff  erfordert,  dass  der
       Deskriptor zum Schreiben geoffnet ist.  Ist der  Deskriptor  zum  Lesen
       und Schreiben geoffnet, konnen beliebige Locks angefordert werden.

       Zusatzlich   zum   expliziten   F_UNLCK  werden  die  Locks  auch  dann
       aufgegeben, wenn der  Prozess  endet  oder  wenn  er  einen  beliebigen
       Deskriptor  der  Datei  schlieBt, auf die die Locks verweisen.  Das ist
       schlecht: Es bedeutet, dass ein Prozess beispielsweise seine Locks  auf
       /etc/passwd     oder    /etc/mtab    verlieren    kann,    wenn    eine
       Bibliotheksfunktion  aus  irgendeinem  Grund  die  Datei   offnen   und
       schlieBen muss.

       Die  Locks  werden  nicht uber fork(2), wohl aber uber execve(2) hinweg
       weitergereicht.   Aufgrund  der   gepufferten   Ein-/Ausgabe   in   der
       stdio(3)-Bibliothek  sollten  ihre  Funktionen nicht zusammen mit Locks
       verwendet werden.  Statt dessen sind read(2) und write(2) zu benutzen.

   Verpflichtende (mandatory) Locks
       (Nicht im POSIX-Standard spezifiziert.)  Die oben  beschriebenen  Locks
       konnen  sowohl  empfehlend  oder  verpflichtend verwendet werden.  Ohne
       zusatzliche Schritte sind  sie  empfehlend.   Um  verpflichtende  Locks
       verwenden  zu konnen, mussen sie fur ein Dateisystem mit der Option "-o
       mand" beim Aufruf von mount(8) zugelassen und zusatzlich fur jede Datei
       aktiviert  werden  (indem  in  den  Zugriffsrechten  fur die Gruppe das
       Ausfuhrungsbit geloscht und das Set-GID-Bit gesetzt wird).

       Empfehlende Locks werden nicht erzwungen,  sondern  sind  nur  nutzlich
       zwischen  kooperierenden  Prozessen.   Verpflichtende  Locks werden fur
       samtliche Prozesse erzwungen.

   Signalkontrolle
       F_GETOWN, F_SETOWN, F_GETSIG und F_SETSIG werden benutzt, um Signale zu
       kontrollieren, die die Verfugbarkeit von Ein- und Ausgaben anzeigen:

       F_GETOWN
              Gibt die PID (oder Prozessgruppen-ID) eines Prozesses zuruck der
              im Augenblick ein SIGIO- oder SIGURG-Signal fur ein Ereignis auf
              dem  Deskriptor  fd  erhalt.  Prozessgruppen werden als negative
              Werte zuruckgegeben.

       F_SETOWN
              Setzt die PID (oder Prozessgruppen-ID) fur  einen  Prozess,  der
              bei  Ereignissen  auf  dem Deskriptor fd ein SIGIO- oder SIGURG-
              Signal ubermittelt bekommen  soll.   Prozessgruppen  werden  als
              negative Werte angegeben.  (Mit Hilfe von F_SETSIG kann auch ein
              anderes Signal als SIGIO angefordert werden.)

              Das SIGIO-Signal wird ausgesandt, falls uber den Dateideskriptor
              neue  Eingabedaten gelesen oder weitere Ausgabedaten geschrieben
              werden konnen.   Als  Voraussetzung  dafur  muss  weiterhin  das
              Statusflag O_ASYNC fur den Deskriptor gesetzt sein (entweder als
              Flag beim Aufruf von  open(2)  oder  spater  uber  das  Kommando
              F_SETFL von fcntl).

              Welcher  Prozess  oder  welche  Prozessgruppe das Signal erhalt,
              wird mit Hilfe  des  Kommandos  F_SETOWN  von  fcntl  gesteuert.
              Handelt  es  sich  bei  dem Deskriptor um einen Socket, legt der
              Aufruf gleichzeitig auch den Empfanger von SIGURG-Signalen fest.
              Derartige  Signale  werden  ausgesandt, wenn ein Paket auBerhalb
              der normalen Reihenfolge eintrifft.   (SIGURG  wird  immer  dann
              ausgesandt,  wenn select(2) anzeigen wurde, dass sich der Socket
              in einem "auBergewohnlichen Zustand" befindet.)  Bezeichnet  der
              Deskriptor  ein  Dateneingabegerat, wird das SIGIO-Signal an die
              zugehorige Vordergrundprozessgruppe geschickt.  geschickt.

       F_GETSIG
              Gibt die Nummer des Signals zuruck, das verwendet wird, um  Ein-
              und  Ausgabeereignisse  anzuzeigen.  Ein Wert von null bedeutet,
              dass SIGIO benutzt  wird.   Jeder  andere  Wert  (einschlieBlich
              SIGIO)  entspricht der verwendeten Signalnummer.  In diesem Fall
              konnen weitere Informationen uber die Signalverarbeitungsroutine
              abgerufen werden, sofern sie mit SA_SIGINFO installiert wurde.

       F_SETSIG
              Setzt  die  Nummer  des Signals, das verwendet wird, um Ein- und
              Ausgabeereignisse anzuzeigen.  Ein Wert von null bedeutet,  dass
              SIGIO  benutzt  wird.   Jeder andere Wert (einschlieBlich SIGIO)
              bezeichnet die verwendende Signalnummer.  In diesem Fall  konnen
              weitere   Informationen   uber   die  Signalverarbeitungsroutine
              abgerufen werden, sofern sie mit SA_SIGINFO installiert wurde.

              Durch Kombination von F_SETSIG mit von Null verschiedenen Werten
              und   SA_SIGINFO   fur   die  Signalverarbeitungsroutine  (siehe
              sigaction(2)), erhalt die  Routine  in  der  Struktur  siginfo_t
              Zusatzinformationen  uber  das  Ein-/Ausgabeereignis.  Zeigt das
              Feld si_code an, dass die  Quelle  SI_SIGIO  ist,  enthalt  Feld
              si_fd den zugehorigen Dateideskriptor.  Andernfalls stehen keine
              weiteren Informationen  zur  Verfugung,  an  welchem  Deskriptor
              Ein-/Ausgaben  anliegen,  und  man  sollte  auf die gewohnlichen
              Mechanismen  (select(2),  poll(2),  read(2)  in  Verbindung  mit
              O_NONBLOCK, etc.) zuruckgreifen, um sie zu ermitteln.

              Wird  ein  POSIX.1b-Echtzeitsignal  (Signalnummer  >=  SIGRTMIN)
              ausgewahlt,   konnen   mehrere   Ein-/Ausgabeereignisse    unter
              derselben  Signalnummer aufgereiht werden.  (Das Aufreihen hangt
              ab vom verfugbaren Speicher.)  Wie oben stehen auch hier weitere
              Informationen     bereit,     falls     SA_SIGINFO    fur    die
              Signalverarbeitungsroutine gesetzt ist.

       Mit  Hilfe  dieser  Mechanismen  ist  es   moglich,   voll   asynchrone
       Ein-/Ausgabe  zu  implementieren,  ohne  signifikant auf select(2) oder
       poll(2) zuruckzugreifen.

       Die Verwendung von O_ASYNC, F_GETOWN, F_SETOWN ist spezifisch  fur  BSD
       und  Linux.   F_GETSIG  und  F_SETSIG sind Linux-spezifisch.  Ahnliches
       lasst sich im Rahmen des POSIX-Standards durch asynchrone  Ein-/Ausgabe
       und die Struktur aio_sigevent erreichen;  sie sind auch unter Linux als
       Teil der GNU-C-Bibliothek (glibc) verfugbar.

   Leases
       F_SETLEASE und F_GETLEASE (seit  Linux  2.4)  werden  benutzt,  um  die
       aktuellen   Einstellungen   eines   Leases  zu  setzen  beziehungsweise
       abzufragen, das der aufrufende Prozess auf die durch den Deskriptor  fd
       beschriebene  Datei  besitzt.   Mittels eines Dateileases kann sich ein
       Prozess (der Lease-Inhaber) durch ein  Signal  benachrichtigen  lassen,
       falls  ein anderer Prozess (der Mitbewerber) versucht, mit open(2) oder
       truncate(2) auf die Datei zuzugreifen.

       F_SETLEASE
              Setzt oder entfernt ein Dateilease, abhangig vom Wert in arg:

              F_RDLCK
                     Erwirbt ein lesendes  Lease.   Der  Prozess  erhalt  dann
                     Nachricht,  sobald  ein  anderer  Prozess  die  Datei fur
                     Schreibzugriff offnet oder sie verkurzen will.

              F_WRLCK
                     Erwirbt  ein  schreibendes  Lease.   Der  Prozess  erhalt
                     Nachricht,  sobald  ein  anderer Prozess die Datei offnet
                     (fur Schreib- oder Lesezugriff) oder sie verkurzen  will.
                     Ein  schreibendes  Lease  kann  nur erworben werden, kein
                     anderer Prozess die Datei augenblicklich geoffnet hat.

              F_UNLCK
                     Entfernt das Lease von der Datei.

       Ein Prozess kann nur einen Typ  von  Lease  auf  eine  bestimmte  Datei
       besitzen.

       Leases konnen nur fur gewohnliche Dateien erworben werden.  Ein Prozess
       ohne Sonderprivilegien darf nur  Leases  auf  Dateien  erwerben,  deren
       Dateisystem-UID der UID des Prozesses entspricht.

       F_GETLEASE
              Zeigt  den  Typ  des  Leases  an fur die durch den Deskriptor fd
              beschriebene Datei.  Der Ruckgabewert ist F_RDLCK, F_WRLCK  oder
              F_UNLCK,  je  nachdem, ob der Prozess ein lesendes, schreibendes
              oder kein Lease auf die Datei besitzt.  (Das dritte Argument  zu
              fcntl() wird ausgelassen.)

       Wenn der Mitbewerber einen open()- oder truncate()-Aufruf ausfuhrt, der
       mit dem uber F_SETLEASE erworbenen Lease in Konflikt  steht,  wird  der
       Systemaufruf  durch  den Kernel angehalten.  (Ausgenommen, der hat beim
       Offnen der Datei mit open() das Flag O_NONBLOCK angegeben.   In  diesem
       Fall  kehrt  der Aufruf sofort mit dem Fehler EWOULDBLOCK zuruck.)  Der
       Kernel  benachrichtigt  den  Lease-Inhaber  durch   ein   Signal   (fur
       gewohnlich  SIGIO).   Der  Lease-Inhaber  sollte daraufhin alle notigen
       Aufraumarbeiten veranlassen (beispielsweise zwischengespeicherte  Daten
       schreiben),  um  die  Datei auf den Zugriff durch einen anderen Prozess
       vorzubereiten und anschlieBend  sein  Lease  entfernen,  indem  er  das
       Kommando F_SETLEASE mit F_UNLCK in arg ausfuhrt.

       Versaumt es der Inhaber, das Lease innerhalb der in /proc/sys/fs/lease-
       break-time genannten Anzahl von Sekunden zu entfernen, dann bricht  der
       Kernel gewaltsam das Lease.  Das gilt nicht, falls der Systemaufruf des
       Mitbewerbers bereits zuvor abgebrochen worden ist, das heiBt, wenn  der
       Mitbewerber  die  Datei  mit  O_NONBLOCK  geoffnet  hatte  oder  in der
       Zwischenzeit ein Signal empfangen hat.

       Sobald das Lease freiwillig oder gewaltsam entfernt wurde und falls der
       Systemaufruf  des  Mitbewerbers  nach  wie  vor blockiert ist, gibt der
       Kernel den Aufruf nun wieder frei.

       SIGIO ist das Standardsignal, mit dem der Lease-Inhaber  benachrichtigt
       wird.   Es  kann  jedoch  mit  Hilfe des Kommandos F_SETSIG fur fcntl()
       verandert werden.  Wird ein F_SETSIG-Kommando ausgefuhrt (selbst eines,
       das   SIGIO   angibt)  und  wurde  die  Signalverarbeitungsroutine  mit
       SA_SIGINFO angelegt, dann erhalt die Routine als zweites  Argument  die
       Struktur   siginfo_t   ubergeben.   Deren  Eintrag  si_fd  enthalt  den
       Deskriptor  auf  die  geleaste  Datei,  auf  die  ein  anderer  Prozess
       zugreifen  will.   (Das  ist dann sinnvoll, wenn der Prozess Leases auf
       mehrere Dateien besitzt.)

   Benachrichtigungen "uber Ver"anderungen an Dateien und Verzeichnissen
       F_NOTIFY
              (seit Linux  2.4)  Erteilt  eine  Nachricht,  sobald  ein  durch
              Deskriptor   fd   beschriebenes   Verzeichnis   oder   eine  der
              enthaltenen  Dateien   verandert   wird.    Die   mitzuteilenden
              Ereignisse  sind  in  arg  zu  bestimmen, und zwar als Bitmaske,
              gebildet aus bitweisem Oder von keinem oder beliebig vielen  der
              folgenden Bits:

              Bit         Beschreibung (Ereignis im Verzeichnis)
              ------------------------------------------------------------------
              DN_ACCESS   Auf eine Datei wurde zugegriffen (read,
                          pread, readv)
              DN_MODIFY   Eine Datei wurde verandert (write,
                          pwrite, writev, truncate, ftruncate)
              DN_CREATE   Eine Datei wurde erstellt (open, creat,
                          mknod, mkdir, link, symlink, rename)
              DN_DELETE   Eine Datei wurde entfernt (unlink,
                          Umbenennen in ein anderes Verzeichnis, rmdir)
              DN_RENAME   Eine Datei in diesem Verzeichnis wurde
                          umbenannt (rename)
              DN_ATTRIB   Die Attribute eine Datei wurden verandert
                          (chown, chmod, utime[s])

              (Um  diese  Definitionen  zu  erhalten,  muss  vor Einbinden von
              <fcntl.h> das Makro _GNU_SOURCE definiert sein.)

              Normalerweise handelt es sich um "Einweg"-Benachrichtigungen, so
              dass  die  Anwendung  sich fur jede weitere Mitteilung stets neu
              registrieren muss.  Alternativ dazu kann DN_MULTISHOT  angegeben
              werden,  und die Benachrichtigungen werden solange gesendet, bis
              sie explizit abbestellt werden.

              Eine  Serie  von  F_NOTIFY-Anforderungen  ist   kumulativ,   die
              Ereignisse   in   arg   werden   zu  den  bereits  angeforderten
              hinzugefugt.  Um Benachrichtigungen  uber  samtliche  Ereignisse
              abzubestellen, ist F_NOTIFY mit 0 als arg auszufuhren.

              Benachrichtigt   wird  duch  Ubermittlung  eines  Signals.   Das
              Standardsignal ist SIGIO, es kann  jedoch  durch  das  F_SETSIG-
              Kommando  zu fcntl() geandert werden.  In diesem Fall erhalt die
              Signalverarbeitungsroutine als  zweites  Argument  die  Struktur
              siginfo_t  ubergeben (sofern die Routine mit SA_SIGINFO angelegt
              wurde).  Deren Eintrag si_fd enthalt  den  Dateideskriptor,  der
              die  Benachrichtigung  ausgelost  hat  (nutzlich,  falls mehrere
              Verzeichnisse uberwacht werden).

              Speziell  in  Verbindung  mit  DN_MULTISHOT  sollten   POSIX.1b-
              Echtzeitsignale  fur  die  Benachrichtigung verwendet werden, so
              dass mehrere Nachrichten aufgereiht werden konnen.

R"UCKGABEWERTE

       Fur  einen  erfolgreichen  Aufruf  hangt  der  Ruckgabewert   von   der
       ausgefuhrten Operation ab:

       F_DUPFD  Der neue File-Deskriptor.

       F_GETFD  Der Inhalt des Flags.

       F_GETFL  Der Inhalt der Flags.

       F_GETOWN Der Besitzer des Deskriptors.

       F_GETSIG Wert  des Signals zur Anzeige moglicher Ein-/Ausgabe oder null
                fur gewohnliches SIGIO-Verhalten.

       Alle anderen Kommandos
                Null.

       Bei einem Fehler wird -1 zuruckgegeben und errno entsprechend gesetzt.

FEHLER

       EACCES or EAGAIN
                Aktion ist aufgrund von Locks anderer Prozesse  nicht  moglich
                oder  weil  ein  anderer  Prozess die Datei in seinen Speicher
                gespiegelt hat.

       EBADF    fd ist kein geoffneter Dateideskriptor oder der  Zugriffsmodus
                stimmt  nicht mit dem Typ des angeforderten Locks uberein (fur
                F_SETLK und F_SETLKW).

       EDEADLK  Es wurde erkannt, dass das angeforderte  F_SETLKW-Kommando  zu
                einem Deadlock fuhren wurde.

       EFAULT   lock verweist auBerhalb des verfugbaren Adressraums.

       EINTR    Kommando  wurde  durch ein Signal unterbrochen (fur F_SETLKW).
                Oder Kommando wurde durch ein Signal unterbrochen,  bevor  das
                Lock  uberpruft  und  erworben  werden konnte (fur F_GETLK Und
                F_SETLK).  Tritt vor allem auf, wenn ein  Lock  auf  entfernte
                Dateien  (etwa uber NFS) angefordert wird, ist jedoch auch auf
                lokalen Dateisystemen moglich.

       EINVAL   arg ist negativ oder groBer als der maximal erlaubte Wert (fur
                F_DUPFD)   oder  arg  ist  keine  erlaubte  Signalnummer  (fur
                F_SETSIG).

       EMFILE   Der  ProzeB  hat  bereits  das  Maximum  an  Dateideskriptoren
                geoffnet (fur F_DUPFD).

       ENOLCK   Der  ProzeB hat zu viele Locks auf gemeinsame Speichersegmente
                geoffnet, die Locktabelle ist voll oder es trat ein Fehler auf
                bei  dem  Versuch,  ein  Lock  von  einem  anderen  Rechner zu
                erhalten (etwa uber NFS).

       EPERM    Es wurde  versucht,  fur  eine  Datei  das  Flag  O_APPEND  zu
                loschen,  deren  Zugriffsattribute  nur  das Anfugen von Daten
                erlauben.

BEMERKUNGEN

       Die Fehler, die von dup2(2) zuruckgegeben werden, sind anders  als  die
       von F_DUPFD.

       Seit Kernelversion 2.0 werden die durch flock(2) und fcntl(2) gesetzten
       Locks nicht mehr gegeneinander abgeglichen.

       POSIX 1003.1-2001 erlaubt negative Langenangaben in l_len.   In  diesem
       Fall  umfaBt  das Lock den Bereich von l_start+l_len bis einschlieBlich
       l_start-1.   Unter  Linux  wird   das   seit   den   Versionen   2.4.21
       beziehungsweise 2.5.49 unterstutzt.

       Verschiedene  Systeme definieren in struct flock weitere Felder wie zum
       Beispiel  l_sysid.   Denn  offensichtlich  ist  l_pid  nicht  ubermaBig
       sinnvoll,  falls  der  ProzeB,  der  ein  Lock  halt, auf einer anderen
       Maschine laufen kann.

ABGESTIMMT MIT

       SVr4, SVID, POSIX, X/OPEN, BSD 4.3.   In  POSIX.1  sind  lediglich  die
       Operationen  F_DUPFD,  F_GETFD,  F_SETFD,  F_GETFL,  F_SETFL,  F_GETLK,
       F_SETLK und F_SETLKW spezifiziert.  F_GETOWN und F_SETOWN  stammen  aus
       der  BSD-Welt  und  werden  in  SVr4  nicht  unterstutzt;  F_GETSIG und
       F_SETSIG  sind  Linux-spezifisch.   Auch   F_NOTIFY,   F_GETLEASE   und
       F_SETLEASE  gibt es nur unter Linux.  Um ihre Definitionen zu erhalten,
       muB zusatzlich noch  das  Makro  _GNU_SOURCE  definiert  werden,  bevor
       <fcntl.h>  eingebunden  wird.   Die  gultigen Flags F_GETFL und F_SETFL
       entsprechen  den  von  open(2)  unterstutzten  und  unterscheiden  sich
       zwischen  verschiedenen  Systemen;  O_APPEND,  O_NONBLOCK, O_RDONLY und
       O_RDWR sind  in  POSIX.1  festgelegt.   SVr4  unterstutzt  verschiedene
       weitere Optionen und Flags, die hier nicht aufgefuhrt sind.

       Unter  SVr4  sind  EIO,  ENOLINK und EOVERFLOW als zusatzliche mogliche
       Fehler dokumentiert.

AUTOREN

       Drew Eckhardt, Michael Haardt, Ian Jackson  und  Martin  Schulze.   Ins
       Deutsche  ubersetzt  von  Martin  Schulze  (joey@infodrom.north.de) und
       Daniel Kobras (kobras@linux.de).

SIEHE AUCH

       dup2(2), flock(2), lockf(3), open(2), socket(2)

       Siehe   auch    locks.txt,    mandatory.txt    und    dnotify.txt    in
       /usr/src/linux/Documentation.