File: fcntl.2

package info (click to toggle)
manpages-de 0.5-4.2
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 3,768 kB
  • ctags: 9
  • sloc: makefile: 86
file content (742 lines) | stat: -rw-r--r-- 24,214 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
.\" Hey Emacs! This file is -*- nroff -*- source.
.\"
.\" This manpage is Copyright (C) 1992 Drew Eckhardt;
.\"                               1993 Michael Haardt, Ian Jackson.
.\"                               1998 Jamie Lokier;
.\"                               2002 Michael Kerrisk.
.\"                               1995 Martin Schulze
.\"
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one
.\" 
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date.  The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein.  The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\" 
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\"
.\" Modified Sat Jul 24 13:39:26 1993 by Rik Faith (faith@cs.unc.edu)
.\" Modified Tue Sep 26 21:47:21 1995 by Andries Brouwer <aeb@cwi.nl>
.\" and again on 960413 and 980804 and 981223.
.\" Modified Fri Dec 11 17:57:27 1998 by Jamie Lokier <jamie@imbolc.ucc.ie>
.\" Applied correction by Christian Ehrhardt - aeb, 990712
.\" Modified 23 Apr 02, Michael Kerrisk, <mtk16@ext.canterbury.ac.nz>
.\"     Added note on F_SETFL and O_DIRECT
.\"     Complete rewrite + expansion of material on file locking
.\"     Incorporated description of F_NOTIFY, drawing on
.\"             Stephen Rothwell's notes in Documentation/dnotify.txt.
.\"     Added description of F_SETLEASE and F_GETLEASE
.\" Corrected and polished, aeb, 020527.
.\"
.\" Translated into german by Martin Schulze (joey@infodrom.north.de)
.\" Modified Mon Jun 10 12:09:24 1996 by Martin Schulze (joey@linux.de)
.\"
.TH FCNTL 2 "24. April 2002" Linux-2.5.18 "Systemaufrufe"
.SH BEZEICHNUNG
fcntl \- Manipulation von Dateideskriptoren
.SH SYNOPSIS
.nf
.B #include <unistd.h>
.B #include <fcntl.h>
.sp
.BI "int fcntl(int " fd ", int " cmd );
.BI "int fcntl(int " fd ", int " cmd ", long " arg );
.BI "int fcntl(int " fd ", int " cmd ", struct flock *" lock );
.fi
.SH DESCRIPTION
.B fcntl
fhrt eine von vielen unterschiedlichen Operationen auf dem
File-Deskriptor 
.I fd
aus.  Die jeweilige Operation wird durch den Parameter
.I cmd
angegeben.
.SS "Schlieen beim Ausfhren (close-on-exec)"
.TP
.B F_DUPFD
Sucht den verfgbaren File-Deskriptor mit der niedrigsten Nummer
grer oder gleich
.I arg
und legt in
.I fd
eine Kopie davon an.  Im Gegensatz dazu verwendet
.BR dup2 (2)
exakt den angegebenen Deskriptor.
.sp
Die alten und neuen Deskriptoren knnen ausgetauscht werden.  Sie
verwenden beide die gleichen Locks, Positionszeiger und Flags.  Wenn
beispielsweise die Dateiposition des einen Deskriptors mit
.B lseek
gendert wird, dann ist sie gleichzeitig auch beim anderen Deskriptor gendert.
.sp
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 Ausfhren nicht geschlossen wird.
.sp
Bei Erfolg wird der neue Deskriptor zurckgegeben.
.TP
.B F_GETFD
Liest das close-on-exec-Flag.  Ist das
.BR FD_CLOEXEC -Bit
0, so bleibt die Datei bei einem
.B exec
geffnet, ansonsten wird sie geschlossen.
.TP
.B F_SETFD
Setzt das close-on-exec-Flag auf den Wert, des
.BR FD_CLOEXEC -Bits
in
.IR arg .
.SS "Die Statusflags einer Datei"
Jedem File-Deskriptor sind verschiedene Flags zugeordnet, die beim Aufruf von
.BR open (2)
.\" oder
.\" .BR creat (2)
initialisiert und spter durch
.BR fcntl (2)
verndert werden knnen.  Kopien eines File-Deskriptors, die mit
.BR dup2 (2)
oder
.BR fork (2),
etc. erzeugt wurden, besitzen identische Flags.
.sp
Die einzelnen Flags und ihre Bedeutung sind in
.BR open (2)
beschrieben.
.TP
.B F_GETFL
Liest die Flags des Deskriptors.
.TP
.B F_SETFL
Setzt die Flags des Deskriptors, die sich auf den Dateistatus beziehen,
auf die in
.I arg
angegebenen Werte.  Die weiteren Bits fr Zugriffsmodus und Dateierzeugung
werden ignoriert.  Unter Linux lassen sich auf diese Weise nur die
Flags O_APPEND, O_NONBLOCK, O_ASYNC und O_DIRECT verndern.
.P
.SS "Empfehlendes (advisory) Locking"
.TP
Man benutzt
.BR F_GETLK ", " F_SETLK " und " F_SETLKW ,
um Locks fr bestimmte Segmente in einer Datei anzufordern, aufzugeben oder
zu testen.  Das dritte Argument
.I lock
verweist auf eine Struktur, die zumindest die folgenden Eintrge enthlt
(die Reihenfolge ist nicht festgelegt):
.in +2n
.nf
.sp
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 fr l_len Bytes anfordern */
    pid_t l_pid;     /* PID des Prozesses, der das Lock blockiert
                        (nur F_GETLK) */
    ...
};
.fi
.in -2n
.P
Die Eintrge
.IR l_whence ", " l_start ", und " l_len
bestimmen den Bereich, fr den das Lock angefordert werden soll.
.I l_start
gibt den Anfang des Bereichs an, und zwar
relativ zum Anfang der Datei (falls
.I l_whence
auf
.B SEEK_SET
gesetzt ist),
relativ zur aktuellen Position in der Datei (falls
.I l_whence
auf
.B SEEK_CUR
gesetzt ist),
bzw. relativ zum Dateiende (falls
.I l_whence
auf
.B SEEK_END
gesetzt ist).  In den beiden zuletzt genannten Fllen kann
.I l_start
auch negativ sein, sofern es dadurch nicht ber den Beginn der Datei hinaus
verweist.  Das Lock wird fr die in
.I l_len
angegebene Anzahl von Bytes angefordert.  Sie darf nicht negativ sein.
(Man beachte jedoch auch die ANMERKUNGEN unten.)  Der Bereich darf ber 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
.IR l_whence " und " l_start
bestimmten Position beginnt und bis zum Dateiende reicht, gleichgltig auf
welche Gre die Datei noch anwchst.
.P
Der Eintrag
.I l_type
wird benutzt, um entweder ein Lock fr lesenden
.RB ( F_RDLCK )
oder schreibenden
.RB ( F_WDLCK )
Zugriff auf die Datei anzufordern.
Beliebig viele Prozesse drfen ein Lock zum Lesen besitzen (geteiltes Lock),
aber nur ein Prozess gleichzeitig darf ein Lock zum Schreiben erhalten
(ausschlieendes Lock).  Ein ausschlieendes Lock schliet smtliche anderen
Locks aus, also sowohl lesende, als auch andere schreibende.
Ein einzelner Prozess darf fr ein bestimmtes Dateisegment nur einen einzigen
Typ von Lock besitzen; wird ein neues Lock fr einen Bereich angefordert, fr
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 berein, knnen sie
dadurch aufgeteilt, verkleinert oder mit anderen Locks vereinigt werden.)
.TP
.B F_SETLK
Fordert ein Lock an, falls
.I l_type
auf
.BR F_RDLCK oder F_WRLCK
gesetzt ist.  Gibt ein Lock auf, falls
.I l_type
auf
.B F_UNLCK
gesetzt ist.  Der angeforderte Bereich wird durch die Eintrge
.IR l_whence ", " l_start " und " l_len
in
.I lock
angegeben.  Falls ein anderer Prozess ein konkurrierendes Lock hlt, gibt
dieser Aufruf \-1 zurck und setzt
.I errno
auf
.B EACCESS
oder
.BR EAGAIN .
.TP
.B F_SETLKW
Unterscheidet sich nur dann von
.BR F_SETLK ,
wenn ein anderer Prozess ein konkurrierendes Lock hlt.  In diesem Fall
wartet
.B F_SETLKW
auf die Freigabe.  Der Aufruf kann durch ein Signal unterbrochen werden.
Dann wird zunchst der Signalhandler abgearbeitet.  Direkt im Anschluss
wird
.BR fcntl ()
mit Rckgabewert \-1 beendet und
.I errno
auf
.B EINTR
gesetzt.
.TP
.B F_GETLK
Beim Aufruf beschreibt
.I lock
ein zu testendes Lock auf eine Datei.  Knnte es erfolgreich gesetzt werden,
so setzt
.BR fcntl ()
den Eintrag
.I l_type
in
.I lock
auf
.B F_UNLCK
und lsst die brigen Felder unverndert.  Sind bereits ein oder mehrere
konkurrierende Locks gesetzt, werden die Felder
.IR l_type ", " l_whence ", " l_start " und " l_len
in
.I lock
mit Informationen ber eines der Locks gefllt.  Die PID des zugehrigen
Prozesses wird in
.I l_pid
zurckgegeben.
.P
Um ein Lock fr Lesezugriff anzufordern, muss der Deskriptor zum Lesen geffnet
sein.  Ein Lock fr Schreibzugriff erfordert, dass der Deskriptor zum Schreiben
geffnet ist.  Ist der Deskriptor zum Lesen und Schreiben geffnet, knnen
beliebige Locks angefordert werden.
.P
Zustzlich zum expliziten
.I F_UNLCK
werden die Locks auch dann aufgegeben, wenn der Prozess endet
oder wenn er einen
.I beliebigen
Deskriptor der Datei schliet, auf die die Locks verweisen.  Das ist schlecht:
Es bedeutet, dass ein Prozess beispielsweise seine Locks auf
.I /etc/passwd
oder
.I /etc/mtab
verlieren kann, wenn eine Bibliotheksfunktion aus irgendeinem Grund die
Datei ffnen und schlieen muss.
.P
Die Locks werden nicht ber
.BR fork (2),
wohl aber ber
.BR execve (2)
hinweg weitergereicht.
Aufgrund der gepufferten Ein-/Ausgabe in der
.BR stdio (3)-Bibliothek
sollten ihre Funktionen nicht zusammen mit Locks verwendet werden.
Statt dessen sind
.BR read (2)
und
.BR write (2)
zu benutzen.
.P
.SS "Verpflichtende (mandatory) Locks"
(Nicht im POSIX-Standard spezifiziert.)
Die oben beschriebenen Locks knnen sowohl empfehlend oder verpflichtend
verwendet werden.  Ohne zustzliche Schritte sind sie empfehlend.
Um verpflichtende Locks verwenden zu knnen, mssen sie fr ein Dateisystem
mit der Option "-o mand" beim Aufruf von
.BR mount (8)
zugelassen und zustzlich fr jede Datei aktiviert werden (indem in den
Zugriffsrechten fr die Gruppe das Ausfhrungsbit gelscht und das
Set-GID-Bit gesetzt wird).
.P
Empfehlende Locks werden nicht erzwungen, sondern sind nur ntzlich zwischen
kooperierenden Prozessen.  Verpflichtende Locks werden fr smtliche Prozesse
erzwungen.
.P
.SS "Signalkontrolle"
.BR F_GETOWN ", " F_SETOWN ", " F_GETSIG " und " F_SETSIG
werden benutzt, um Signale zu kontrollieren, die die Verfgbarkeit von
Ein- und Ausgaben anzeigen:
.TP
.B F_GETOWN
Gibt die PID (oder Prozessgruppen-ID) eines Prozesses zurck der im Augenblick
ein SIGIO- oder SIGURG-Signal fr ein Ereignis auf dem
Deskriptor
.I fd
erhlt.
Prozessgruppen werden als negative Werte zurckgegeben.
.TP
.B F_SETOWN
Setzt die PID (oder Prozessgruppen-ID) fr einen Prozess, der 
bei Ereignissen auf dem Deskriptor
.I fd
ein SIGIO- oder SIGURG-Signal bermittelt bekommen soll.
Prozessgruppen werden als negative Werte angegeben.
(Mit Hilfe von
.BR F_SETSIG
kann auch ein anderes Signal als SIGIO angefordert werden.)

.\" Aus glibc.info:
Das SIGIO-Signal wird ausgesandt, falls ber den Dateideskriptor neue
Eingabedaten gelesen oder weitere Ausgabedaten geschrieben werden knnen.
Als Voraussetzung dafr muss weiterhin das Statusflag
.B O_ASYNC
fr den Deskriptor gesetzt sein (entweder als Flag beim Aufruf von
.IR open (2)
oder spter ber das Kommando
.B F_SETFL
von
.BR fcntl ).
.sp
Welcher Prozess oder welche Prozessgruppe das Signal erhlt, wird mit Hilfe
des Kommandos
.B F_SETOWN
von
.B fcntl
gesteuert.  Handelt es sich bei dem Deskriptor um einen Socket, legt der
Aufruf gleichzeitig auch den Empfnger von SIGURG-Signalen fest.  Derartige
Signale werden ausgesandt, wenn ein Paket auerhalb der normalen Reihenfolge
eintrifft.  (SIGURG wird immer dann ausgesandt, wenn
.BR select (2)
anzeigen wrde, dass sich der Socket in einem "auergewhnlichen Zustand"
befindet.)  Bezeichnet der Deskriptor ein Dateneingabegert, wird das
SIGIO-Signal an die zugehrige Vordergrundprozessgruppe geschickt.
geschickt.
.TP
.B F_GETSIG
Gibt die Nummer des Signals zurck, das verwendet wird, um Ein- und
Ausgabeereignisse anzuzeigen.  Ein Wert von null bedeutet, dass
SIGIO benutzt wird.  Jeder andere Wert (einschlielich SIGIO) entspricht
der verwendeten Signalnummer.  In diesem Fall knnen weitere Informationen
ber die Signalverarbeitungsroutine abgerufen werden, sofern sie mit
SA_SIGINFO installiert wurde.
.TP
.B 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 (einschlielich SIGIO) bezeichnet
die verwendende Signalnummer.  In diesem Fall knnen weitere Informationen
ber die Signalverarbeitungsroutine abgerufen werden, sofern sie mit
SA_SIGINFO installiert wurde.
.sp
Durch Kombination von
.B F_SETSIG
mit von Null verschiedenen Werten und SA_SIGINFO fr die
Signalverarbeitungsroutine (siehe
.BR sigaction (2)),
erhlt die Routine in der Struktur
.I siginfo_t
Zusatzinformationen ber das Ein-/Ausgabeereignis.  Zeigt das Feld
.I si_code
an, dass die Quelle SI_SIGIO ist, enthlt Feld
.I si_fd
den zugehrigen Dateideskriptor.  Andernfalls stehen keine weiteren
Informationen zur Verfgung, an welchem Deskriptor Ein-/Ausgaben anliegen,
und man sollte auf die gewhnlichen Mechanismen
.RB ( select (2),
.BR poll (2),
.BR read (2)
in Verbindung mit
.BR O_NONBLOCK ,
etc.) zurckgreifen, um sie zu ermitteln.
.sp
Wird ein POSIX.1b-Echtzeitsignal (Signalnummer >= SIGRTMIN) ausgewhlt,
knnen mehrere Ein-/Ausgabeereignisse unter derselben Signalnummer
aufgereiht werden.  (Das Aufreihen hngt ab vom verfgbaren Speicher.)
Wie oben stehen auch hier weitere Informationen bereit, falls SA_SIGINFO
fr die Signalverarbeitungsroutine gesetzt ist.
.PP
Mit Hilfe dieser Mechanismen ist es mglich, voll asynchrone Ein-/Ausgabe
zu implementieren, ohne signifikant auf
.BR select (2)
oder
.BR poll (2)
zurckzugreifen.
.PP
Die Verwendung von
.BR O_ASYNC ,
.BR F_GETOWN ,
.B F_SETOWN
ist spezifisch fr BSD und Linux.
.B F_GETSIG
und
.B F_SETSIG
sind Linux-spezifisch.  hnliches lsst sich im Rahmen des POSIX-Standards 
durch asynchrone Ein-/Ausgabe und die Struktur
.I aio_sigevent
erreichen;  sie sind auch unter Linux als Teil der GNU-C-Bibliothek (glibc)
verfgbar.
.P
.SS Leases
.B F_SETLEASE
und
.B 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
.I 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
.BR open (2)
oder
.BR truncate (2)
auf die Datei zuzugreifen.
.TP
.B F_SETLEASE
Setzt oder entfernt ein Dateilease, abhngig vom Wert in
.IR arg :

.RS
.TP
.B F_RDLCK
Erwirbt ein lesendes Lease.  Der Prozess erhlt dann Nachricht, sobald ein
anderer Prozess die Datei fr Schreibzugriff ffnet oder sie verkrzen will.
.TP
.B F_WRLCK
Erwirbt ein schreibendes Lease.  Der Prozess erhlt Nachricht, sobald ein
anderer Prozess die Datei ffnet (fr Schreib- oder Lesezugriff) oder sie
verkrzen will.  Ein schreibendes Lease kann nur erworben werden, kein
anderer Prozess die Datei augenblicklich geffnet hat.
.TP
.B F_UNLCK
Entfernt das Lease von der Datei.
.RE
.P
Ein Prozess kann nur einen Typ von Lease auf eine bestimmte Datei besitzen.
.P
Leases knnen nur fr gewhnliche Dateien erworben werden.  Ein Prozess ohne
Sonderprivilegien darf nur Leases auf Dateien erwerben, deren
Dateisystem-UID der UID des Prozesses entspricht.
.TP
.B F_GETLEASE
Zeigt den Typ des Leases an fr die durch den Deskriptor
.I fd
beschriebene Datei.  Der Rckgabewert ist
.BR 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
.BR fcntl ()
wird ausgelassen.)
.PP
Wenn der Mitbewerber einen
.BR open ()\-
oder
.BR truncate ()\-Aufruf
ausfhrt, der mit dem ber
.B F_SETLEASE
erworbenen Lease in Konflikt steht, wird der Systemaufruf durch den Kernel
angehalten.  (Ausgenommen, der hat beim ffnen der Datei mit
.BR open ()
das Flag
.B O_NONBLOCK
angegeben.  In diesem Fall kehrt der Aufruf sofort mit dem Fehler
.B EWOULDBLOCK
zurck.)  Der Kernel benachrichtigt den Lease-Inhaber durch ein Signal
(fr gewhnlich SIGIO).  Der Lease-Inhaber sollte daraufhin alle ntigen
Aufrumarbeiten veranlassen (beispielsweise zwischengespeicherte Daten
schreiben), um die Datei auf den Zugriff durch einen anderen Prozess
vorzubereiten und anschlieend sein Lease entfernen, indem er das Kommando
.B F_SETLEASE
mit
.B F_UNLCK
in
.I arg
ausfhrt.

Versumt es der Inhaber, das Lease innerhalb der in
.I /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 heit, wenn der Mitbewerber die Datei mit
O_NONBLOCK geffnet 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
.B F_SETSIG
fr
.BR fcntl ()
verndert werden.  Wird ein
.BR F_SETSIG -Kommando
ausgefhrt (selbst eines, das SIGIO angibt) und wurde die
Signalverarbeitungsroutine mit SA_SIGINFO angelegt, dann erhlt die Routine
als zweites Argument die Struktur
.I siginfo_t
bergeben.  Deren Eintrag
.I si_fd
enthlt 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.)
.SS "Benachrichtigungen ber Vernderungen an Dateien und Verzeichnissen"
.TP
.B F_NOTIFY
(seit Linux 2.4)
Erteilt eine Nachricht, sobald ein durch Deskriptor
.I fd
beschriebenes Verzeichnis oder eine der enthaltenen Dateien verndert wird.
Die mitzuteilenden Ereignisse sind in 
.I arg
zu bestimmen, und zwar als Bitmaske, gebildet aus bitweisem Oder von keinem
oder beliebig vielen der folgenden Bits:

.TS
l l
----
lB l.
Bit	Beschreibung (Ereignis im Verzeichnis)
DN_ACCESS	Auf eine Datei wurde zugegriffen (read,
	pread, readv)
DN_MODIFY	Eine Datei wurde verndert (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 verndert
	(chown, chmod, utime[s])
.TE
.sp
(Um diese Definitionen zu erhalten, muss vor Einbinden von <fcntl.h> das
Makro _GNU_SOURCE definiert sein.)
.sp
Normalerweise handelt es sich um "Einweg"-Benachrichtigungen, so dass die
Anwendung sich fr jede weitere Mitteilung stets neu registrieren muss.
Alternativ dazu kann
.B DN_MULTISHOT
angegeben werden, und die Benachrichtigungen werden solange gesendet, bis
sie explizit abbestellt werden.

.\" Das folgende sieht nach einem armseligen Schnittstellendesign aus...
Eine Serie von
.BR F_NOTIFY -Anforderungen
ist kumulativ, die Ereignisse in
.I arg
werden zu den bereits angeforderten hinzugefgt.  Um Benachrichtigungen
ber smtliche Ereignisse abzubestellen, ist
.B F_NOTIFY
mit 0 als
.I arg
auszufhren.
.sp
Benachrichtigt wird duch bermittlung eines Signals.  Das Standardsignal
ist SIGIO, es kann jedoch durch das
.BR F_SETSIG -Kommando
zu
.BR fcntl ()
gendert werden.  In diesem Fall erhlt die Signalverarbeitungsroutine als
zweites Argument die Struktur
.I siginfo_t
bergeben (sofern die Routine mit SA_SIGINFO angelegt wurde).  Deren
Eintrag
.I si_fd
enthlt den Dateideskriptor, der die Benachrichtigung ausgelst hat
(ntzlich, falls mehrere Verzeichnisse berwacht werden).
.sp
Speziell in Verbindung mit
.B DN_MULTISHOT
sollten POSIX.1b-Echtzeitsignale fr die Benachrichtigung verwendet werden,
so dass mehrere Nachrichten aufgereiht werden knnen. 
.SH RCKGABEWERTE
Fr einen erfolgreichen Aufruf hngt der Rckgabewert von der ausgefhrten
Operation ab:
.TP 0.9i
.B F_DUPFD
Der neue File-Deskriptor.
.TP
.B F_GETFD
Der Inhalt des Flags.
.TP
.B F_GETFL
Der Inhalt der Flags.
.TP
.B F_GETOWN
Der Besitzer des Deskriptors.
.TP
.B F_GETSIG
Wert des Signals zur Anzeige mglicher Ein-/Ausgabe oder null fr gewhnliches
SIGIO-Verhalten.
.TP
Alle anderen Kommandos
Null.
.PP
Bei einem Fehler wird \-1 zurckgegeben und 
.I errno
entsprechend gesetzt.
.SH FEHLER
.TP 0.9i
.BR EACCES " or " EAGAIN
Aktion ist aufgrund von Locks anderer Prozesse nicht mglich oder weil ein
anderer Prozess die Datei in seinen Speicher gespiegelt hat. 
.TP
.B EBADF
.I fd
ist kein geffneter Dateideskriptor oder der Zugriffsmodus stimmt nicht mit
dem Typ des angeforderten Locks berein (fr
.B F_SETLK
und
.BR F_SETLKW ).
.TP
.B EDEADLK
Es wurde erkannt, dass das angeforderte
.BR F_SETLKW -Kommando
zu einem Deadlock fhren wrde.
.TP
.B EFAULT
.I lock
verweist auerhalb des verfgbaren Adressraums.
.TP
.B EINTR
Kommando wurde durch ein Signal unterbrochen (fr
.BR F_SETLKW ).
Oder Kommando wurde durch ein Signal unterbrochen, bevor das Lock berprft und
erworben werden konnte (fr
.BR F_GETLK " Und " F_SETLK ).
Tritt vor allem auf, wenn ein Lock auf entfernte Dateien (etwa ber NFS)
angefordert wird, ist jedoch auch auf lokalen Dateisystemen mglich.
.TP
.B EINVAL
.I arg
ist negativ oder grer als der maximal erlaubte Wert (fr
.BR F_DUPFD )
oder
.I arg
ist keine erlaubte Signalnummer (fr
.BR F_SETSIG ).
.TP
.B EMFILE
Der Proze hat bereits das Maximum an Dateideskriptoren geffnet (fr
.BR F_DUPFD ).
.TP 
.B ENOLCK
Der Proze hat zu viele Locks auf gemeinsame Speichersegmente geffnet,
die Locktabelle ist voll oder es trat ein Fehler auf bei dem Versuch,
ein Lock von einem anderen Rechner zu erhalten (etwa ber NFS).
.TP
.B EPERM
Es wurde versucht, fr eine Datei das Flag
.B O_APPEND
zu lschen, deren Zugriffsattribute nur das Anfgen von Daten erlauben.
.SH BEMERKUNGEN
Die Fehler, die von 
.BR dup2 (2)
zurckgegeben werden, sind anders als die von 
.BR F_DUPFD .

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

POSIX 1003.1-2001 erlaubt negative Lngenangaben in
.IR l_len .
In diesem Fall umfat das Lock den Bereich von
.IR l_start + l_len
bis einschlielich
.IR l_start -1.
Unter Linux wird das seit den Versionen 2.4.21 beziehungsweise 2.5.49
untersttzt.

Verschiedene Systeme definieren in 
.I "struct flock"
weitere Felder wie zum Beispiel
.IR l_sysid .
Denn offensichtlich ist
.I l_pid
nicht bermig sinnvoll, falls der Proze, der ein Lock hlt, auf einer
anderen Maschine laufen kann.

.SH "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 untersttzt;  F_GETSIG und
F_SETSIG sind Linux-spezifisch.  Auch
.BR F_NOTIFY ", " F_GETLEASE " und " F_SETLEASE
gibt es nur unter Linux.  Um ihre Definitionen zu erhalten, mu
zustzlich noch das Makro _GNU_SOURCE definiert werden, bevor
<fcntl.h> eingebunden wird.
Die gltigen Flags F_GETFL und F_SETFL entsprechen den von
.BR open (2)
untersttzten und unterscheiden sich zwischen verschiedenen Systemen;
O_APPEND, O_NONBLOCK, O_RDONLY und O_RDWR sind in POSIX.1 festgelegt.
SVr4 untersttzt verschiedene weitere Optionen und Flags, die hier nicht
aufgefhrt sind.
.PP
Unter SVr4 sind EIO, ENOLINK und EOVERFLOW als zustzliche mgliche
Fehler dokumentiert.
.SH "AUTOREN"
Drew Eckhardt, Michael Haardt, Ian Jackson und Martin Schulze.
Ins Deutsche bersetzt von Martin Schulze (joey@infodrom.north.de)
und Daniel Kobras (kobras@linux.de).
.SH "SIEHE AUCH"
.BR dup2 (2),
.BR flock (2),
.BR lockf (3),
.BR open (2),
.BR socket (2)
.P
Siehe auch locks.txt, mandatory.txt und dnotify.txt in
/usr/src/linux/Documentation.