File: fcntl.2

package info (click to toggle)
manpages-de 0.7-1
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 3,188 kB
  • ctags: 9
  • sloc: makefile: 83; perl: 61
file content (742 lines) | stat: -rw-r--r-- 24,452 bytes parent folder | download
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
führt eine von vielen unterschiedlichen Operationen auf dem
File-Deskriptor 
.I fd
aus.  Die jeweilige Operation wird durch den Parameter
.I cmd
angegeben.
.SS "Schließen beim Ausführen (close-on-exec)"
.TP
.B F_DUPFD
Sucht den verfügbaren File-Deskriptor mit der niedrigsten Nummer
größer 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 können ausgetauscht werden.  Sie
verwenden beide die gleichen Locks, Positionszeiger und Flags.  Wenn
beispielsweise die Dateiposition des einen Deskriptors mit
.B lseek
geändert wird, dann ist sie gleichzeitig auch beim anderen Deskriptor geändert.
.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 Ausführen nicht geschlossen wird.
.sp
Bei Erfolg wird der neue Deskriptor zurückgegeben.
.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
geöffnet, 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 später durch
.BR fcntl (2)
verändert werden können.  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 für Zugriffsmodus und Dateierzeugung
werden ignoriert.  Unter Linux lassen sich auf diese Weise nur die
Flags O_APPEND, O_NONBLOCK, O_ASYNC und O_DIRECT verändern.
.P
.SS "Empfehlendes (advisory) Locking"
.TP
Man benutzt
.BR F_GETLK ", " F_SETLK " und " F_SETLKW ,
um Locks für bestimmte Segmente in einer Datei anzufordern, aufzugeben oder
zu testen.  Das dritte Argument
.I lock
verweist auf eine Struktur, die zumindest die folgenden Einträge enthält
(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 für l_len Bytes anfordern */
    pid_t l_pid;     /* PID des Prozesses, der das Lock blockiert
                        (nur F_GETLK) */
    ...
};
.fi
.in -2n
.P
Die Einträge
.IR l_whence ", " l_start ", und " l_len
bestimmen den Bereich, für 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 Fällen kann
.I l_start
auch negativ sein, sofern es dadurch nicht über den Beginn der Datei hinaus
verweist.  Das Lock wird für 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, gleichgültig auf
welche Größe die Datei noch anwächst.
.P
Der Eintrag
.I l_type
wird benutzt, um entweder ein Lock für lesenden
.RB ( F_RDLCK )
oder schreibenden
.RB ( F_WDLCK )
Zugriff auf die Datei anzufordern.
Beliebig viele Prozesse dürfen ein Lock zum Lesen besitzen (geteiltes Lock),
aber nur ein Prozess gleichzeitig darf ein Lock zum Schreiben erhalten
(ausschließendes Lock).  Ein ausschließendes Lock schließt sämtliche anderen
Locks aus, also sowohl lesende, als auch andere schreibende.
Ein einzelner Prozess darf für ein bestimmtes Dateisegment nur einen einzigen
Typ von Lock besitzen; wird ein neues Lock für einen Bereich angefordert, für
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, können 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 Einträge
.IR l_whence ", " l_start " und " l_len
in
.I lock
angegeben.  Falls ein anderer Prozess ein konkurrierendes Lock hält, gibt
dieser Aufruf \-1 zurück 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 hält.  In diesem Fall
wartet
.B F_SETLKW
auf die Freigabe.  Der Aufruf kann durch ein Signal unterbrochen werden.
Dann wird zunächst der Signalhandler abgearbeitet.  Direkt im Anschluss
wird
.BR fcntl ()
mit Rückgabewert \-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.  Könnte es erfolgreich gesetzt werden,
so setzt
.BR fcntl ()
den Eintrag
.I l_type
in
.I lock
auf
.B F_UNLCK
und lässt die übrigen Felder unverändert.  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 gefüllt.  Die PID des zugehörigen
Prozesses wird in
.I l_pid
zurückgegeben.
.P
Um ein Lock für Lesezugriff anzufordern, muss der Deskriptor zum Lesen geöffnet
sein.  Ein Lock für Schreibzugriff erfordert, dass der Deskriptor zum Schreiben
geöffnet ist.  Ist der Deskriptor zum Lesen und Schreiben geöffnet, können
beliebige Locks angefordert werden.
.P
Zusätzlich zum expliziten
.I F_UNLCK
werden die Locks auch dann aufgegeben, wenn der Prozess endet
oder wenn er einen
.I beliebigen
Deskriptor der Datei schließt, 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 schließen 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 können sowohl empfehlend oder verpflichtend
verwendet werden.  Ohne zusätzliche Schritte sind sie empfehlend.
Um verpflichtende Locks verwenden zu können, müssen sie für ein Dateisystem
mit der Option "-o mand" beim Aufruf von
.BR mount (8)
zugelassen und zusätzlich für jede Datei aktiviert werden (indem in den
Zugriffsrechten für die Gruppe das Ausführungsbit gelöscht und das
Set-GID-Bit gesetzt wird).
.P
Empfehlende Locks werden nicht erzwungen, sondern sind nur nützlich zwischen
kooperierenden Prozessen.  Verpflichtende Locks werden für sämtliche Prozesse
erzwungen.
.P
.SS "Signalkontrolle"
.BR F_GETOWN ", " F_SETOWN ", " F_GETSIG " und " F_SETSIG
werden benutzt, um Signale zu kontrollieren, die die Verfügbarkeit von
Ein- und Ausgaben anzeigen:
.TP
.B F_GETOWN
Gibt die PID (oder Prozessgruppen-ID) eines Prozesses zurück der im Augenblick
ein SIGIO- oder SIGURG-Signal für ein Ereignis auf dem
Deskriptor
.I fd
erhält.
Prozessgruppen werden als negative Werte zurückgegeben.
.TP
.B F_SETOWN
Setzt die PID (oder Prozessgruppen-ID) für 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 können.
Als Voraussetzung dafür muss weiterhin das Statusflag
.B O_ASYNC
für den Deskriptor gesetzt sein (entweder als Flag beim Aufruf von
.IR open (2)
oder später über das Kommando
.B F_SETFL
von
.BR fcntl ).
.sp
Welcher Prozess oder welche Prozessgruppe das Signal erhält, 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 Empfänger von SIGURG-Signalen fest.  Derartige
Signale werden ausgesandt, wenn ein Paket außerhalb der normalen Reihenfolge
eintrifft.  (SIGURG wird immer dann ausgesandt, wenn
.BR select (2)
anzeigen würde, dass sich der Socket in einem "außergewöhnlichen Zustand"
befindet.)  Bezeichnet der Deskriptor ein Dateneingabegerät, wird das
SIGIO-Signal an die zugehörige Vordergrundprozessgruppe geschickt.
geschickt.
.TP
.B F_GETSIG
Gibt die Nummer des Signals zurück, das verwendet wird, um Ein- und
Ausgabeereignisse anzuzeigen.  Ein Wert von null bedeutet, dass
SIGIO benutzt wird.  Jeder andere Wert (einschließlich SIGIO) entspricht
der verwendeten Signalnummer.  In diesem Fall können 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 (einschließlich SIGIO) bezeichnet
die verwendende Signalnummer.  In diesem Fall können 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 für die
Signalverarbeitungsroutine (siehe
.BR sigaction (2)),
erhält 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, enthält Feld
.I si_fd
den zugehörigen Dateideskriptor.  Andernfalls stehen keine weiteren
Informationen zur Verfügung, an welchem Deskriptor Ein-/Ausgaben anliegen,
und man sollte auf die gewöhnlichen Mechanismen
.RB ( select (2),
.BR poll (2),
.BR read (2)
in Verbindung mit
.BR O_NONBLOCK ,
etc.) zurückgreifen, um sie zu ermitteln.
.sp
Wird ein POSIX.1b-Echtzeitsignal (Signalnummer >= SIGRTMIN) ausgewählt,
können mehrere Ein-/Ausgabeereignisse unter derselben Signalnummer
aufgereiht werden.  (Das Aufreihen hängt ab vom verfügbaren Speicher.)
Wie oben stehen auch hier weitere Informationen bereit, falls SA_SIGINFO
für die Signalverarbeitungsroutine gesetzt ist.
.PP
Mit Hilfe dieser Mechanismen ist es möglich, voll asynchrone Ein-/Ausgabe
zu implementieren, ohne signifikant auf
.BR select (2)
oder
.BR poll (2)
zurückzugreifen.
.PP
Die Verwendung von
.BR O_ASYNC ,
.BR F_GETOWN ,
.B F_SETOWN
ist spezifisch für BSD und Linux.
.B F_GETSIG
und
.B F_SETSIG
sind Linux-spezifisch.  Ähnliches lässt 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)
verfügbar.
.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, abhängig vom Wert in
.IR arg :

.RS
.TP
.B F_RDLCK
Erwirbt ein lesendes Lease.  Der Prozess erhält dann Nachricht, sobald ein
anderer Prozess die Datei für Schreibzugriff öffnet oder sie verkürzen will.
.TP
.B F_WRLCK
Erwirbt ein schreibendes Lease.  Der Prozess erhält Nachricht, sobald ein
anderer Prozess die Datei öffnet (für Schreib- oder Lesezugriff) oder sie
verkürzen will.  Ein schreibendes Lease kann nur erworben werden, kein
anderer Prozess die Datei augenblicklich geöffnet 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 können nur für gewöhnliche 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 für die durch den Deskriptor
.I fd
beschriebene Datei.  Der Rückgabewert 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
ausführt, 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
zurück.)  Der Kernel benachrichtigt den Lease-Inhaber durch ein Signal
(für gewöhnlich SIGIO).  Der Lease-Inhaber sollte daraufhin alle nötigen
Aufräumarbeiten veranlassen (beispielsweise zwischengespeicherte Daten
schreiben), um die Datei auf den Zugriff durch einen anderen Prozess
vorzubereiten und anschließend sein Lease entfernen, indem er das Kommando
.B F_SETLEASE
mit
.B F_UNLCK
in
.I arg
ausführt.

Versäumt 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 heißt, wenn der Mitbewerber die Datei mit
O_NONBLOCK geöffnet 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
für
.BR fcntl ()
verändert werden.  Wird ein
.BR F_SETSIG -Kommando
ausgeführt (selbst eines, das SIGIO angibt) und wurde die
Signalverarbeitungsroutine mit SA_SIGINFO angelegt, dann erhält die Routine
als zweites Argument die Struktur
.I siginfo_t
übergeben.  Deren Eintrag
.I si_fd
enthält 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 Veränderungen 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 verändert 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 verändert (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 verändert
	(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 für 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 hinzugefügt.  Um Benachrichtigungen
über sämtliche Ereignisse abzubestellen, ist
.B F_NOTIFY
mit 0 als
.I arg
auszuführen.
.sp
Benachrichtigt wird duch Übermittlung eines Signals.  Das Standardsignal
ist SIGIO, es kann jedoch durch das
.BR F_SETSIG -Kommando
zu
.BR fcntl ()
geändert werden.  In diesem Fall erhält die Signalverarbeitungsroutine als
zweites Argument die Struktur
.I siginfo_t
übergeben (sofern die Routine mit SA_SIGINFO angelegt wurde).  Deren
Eintrag
.I si_fd
enthält den Dateideskriptor, der die Benachrichtigung ausgelöst hat
(nützlich, falls mehrere Verzeichnisse überwacht werden).
.sp
Speziell in Verbindung mit
.B DN_MULTISHOT
sollten POSIX.1b-Echtzeitsignale für die Benachrichtigung verwendet werden,
so dass mehrere Nachrichten aufgereiht werden können. 
.SH RÜCKGABEWERTE
Für einen erfolgreichen Aufruf hängt der Rückgabewert von der ausgeführten
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 möglicher Ein-/Ausgabe oder null für gewöhnliches
SIGIO-Verhalten.
.TP
Alle anderen Kommandos
Null.
.PP
Bei einem Fehler wird \-1 zurückgegeben und 
.I errno
entsprechend gesetzt.
.SH FEHLER
.TP 0.9i
.BR EACCES " or " EAGAIN
Aktion ist aufgrund von Locks anderer Prozesse nicht möglich oder weil ein
anderer Prozess die Datei in seinen Speicher gespiegelt hat. 
.TP
.B EBADF
.I fd
ist kein geöffneter Dateideskriptor oder der Zugriffsmodus stimmt nicht mit
dem Typ des angeforderten Locks überein (für
.B F_SETLK
und
.BR F_SETLKW ).
.TP
.B EDEADLK
Es wurde erkannt, dass das angeforderte
.BR F_SETLKW -Kommando
zu einem Deadlock führen würde.
.TP
.B EFAULT
.I lock
verweist außerhalb des verfügbaren Adressraums.
.TP
.B EINTR
Kommando wurde durch ein Signal unterbrochen (für
.BR F_SETLKW ).
Oder Kommando wurde durch ein Signal unterbrochen, bevor das Lock überprüft und
erworben werden konnte (für
.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 möglich.
.TP
.B EINVAL
.I arg
ist negativ oder größer als der maximal erlaubte Wert (für
.BR F_DUPFD )
oder
.I arg
ist keine erlaubte Signalnummer (für
.BR F_SETSIG ).
.TP
.B EMFILE
Der Prozeß hat bereits das Maximum an Dateideskriptoren geöffnet (für
.BR F_DUPFD ).
.TP 
.B ENOLCK
Der Prozeß hat zu viele Locks auf gemeinsame Speichersegmente geöffnet,
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, für eine Datei das Flag
.B O_APPEND
zu löschen, deren Zugriffsattribute nur das Anfügen von Daten erlauben.
.SH BEMERKUNGEN
Die Fehler, die von 
.BR dup2 (2)
zurückgegeben 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 Längenangaben in
.IR l_len .
In diesem Fall umfaßt das Lock den Bereich von
.IR l_start + l_len
bis einschließlich
.IR l_start -1.
Unter Linux wird das seit den Versionen 2.4.21 beziehungsweise 2.5.49
unterstützt.

Verschiedene Systeme definieren in 
.I "struct flock"
weitere Felder wie zum Beispiel
.IR l_sysid .
Denn offensichtlich ist
.I l_pid
nicht übermäßig sinnvoll, falls der Prozeß, der ein Lock hält, 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 unterstützt;  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ß
zusätzlich noch das Makro _GNU_SOURCE definiert werden, bevor
<fcntl.h> eingebunden wird.
Die gültigen Flags F_GETFL und F_SETFL entsprechen den von
.BR open (2)
unterstützten und unterscheiden sich zwischen verschiedenen Systemen;
O_APPEND, O_NONBLOCK, O_RDONLY und O_RDWR sind in POSIX.1 festgelegt.
SVr4 unterstützt verschiedene weitere Optionen und Flags, die hier nicht
aufgeführt sind.
.PP
Unter SVr4 sind EIO, ENOLINK und EOVERFLOW als zusätzliche mögliche
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.