oracular (2) fcntl.2.gz

Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       fcntl - manipuluje deskryptorem pliku

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <fcntl.h>

       int fcntl(int fd, int op, ... /* arg */ );

OPIS

       fcntl dokonuje jednej z operacji opisanych poniżej na otwartym deskryptorze pliku fd. Wykonywana operacja
       jest określona przez op.

       fcntl() opcjonalnie może przyjąć trzeci argument. To, czy argument  ten  jest  wymagany,  zależy  od  op.
       Wymagany  typ  argumentu jest wskazany w nawiasie po każdej nazwie op (zwykle wymaganym typem jest int, a
       argument jest identyfikowany określeniem arg) lub podane jest void, gdy argument nie jest wymagany.

       Niektóre z poniższych operacji są obsługiwane jedynie w określonej wersji jądra Linux. Preferowaną metodą
       sprawdzenia,  czy  działające  aktualnie  jądro  obsługuje daną operację, jest przywołanie fcntl() z daną
       wartością op i sprawdzenie, czy wywołanie zawiedzie z błędem EINVAL wskazując, że  jądro  nie  rozpoznało
       tej wartości.

   Duplikowanie deskryptora pliku
       F_DUPFD (int)
              Duplikuje  deskryptor pliku fd za pomocą najniższego dostępnego numeru deskryptora pliku większego
              lub równego arg. Różni się to od dup2(2), korzystającego z konkretnego, zadanego deskryptora.

              Po pomyślnym zakończeniu zwracany jest nowy deskryptor pliku.

              Więcej informacji znajduje się w podręczniku dup(2).

       F_DUPFD_CLOEXEC (int; od Linuksa 2.6.24)
              Jak  w  przypadku  F_DUPFD,  lecz  dodatkowo  ustawia   znacznik   zamknięcia-przy-wykonaniu   dla
              duplikowanego  deskryptora  pliku.  Podanie  tego  znacznika  umożliwia  programowi  na uniknięcie
              dodatkowej operacji F_SETFD fcntl(), w celu ustawienia znacznika FD_CLOEXEC.  Wyjaśnienie  powodu,
              dla którego znacznik ten jest przydatny, znajduje się w opisie O_CLOEXEC w podręczniku open(2).

   Znaczniki deskryptora pliku
       Następujące  operacje  kontrolują  znaczniki powiązane z deskryptorem pliku. Obecnie zdefiniowano jedynie
       jeden taki znacznik: FD_CLOEXEC, znacznik zamknięcia-przy-wykonaniu. Jeśli ustawiony jest bit FD_CLOEXEC,
       to  deskryptor  pliku  zostanie  automatycznie  zamknięty  podczas  pomyślnego wykonania execve(2) (jeśli
       execve(2) zawiedzie,  deskryptor  pliku  jest  pozostawiany  otwarty).  Jeśli  bit  FD_CLOEXEC  nie  jest
       ustawiony, deskryptor pliku pozostanie otwarty podczas wykonania execve(2).

       F_GETFD (void)
              Zwraca (jako wynik funkcji) znaczniki deskryptora pliku; argument arg jest ignorowany.

       F_SETFD (int)
              Ustawia znaczniki deskryptora pliku na wartość określoną w arg.

       W  programach wielowątkowych, użycie F_SETFD fcntl() do ustawienia znacznika zamknięcia przy uruchomieniu
       w tym samym czasie, w którym inny wątek  wykonuje  fork(2)  i  execve(2)  jest  narażone  na  wystąpienie
       sytuacji  wyścigu,  która  może  niezamierzenie  prowadzić  do  wycieku  deskryptora  pliku  do  programu
       wykonującego proces potomny. Szczegóły i sposób  na  uniknięcie  tego  problemu  opisano  przy  znaczniku
       O_CLOEXEC, w podręczniku open(2).

   Znaczniki stanu pliku
       Z  każdym  opisem otwartego pliku stowarzyszonych jest kilka znaczników inicjowanych przez open(2), które
       mogą ewentualnie być modyfikowane przez fcntl(2). Zduplikowane deskryptory  pliku  (utworzone  za  pomocą
       dup(2),  fork(2), itp.) odnoszą się do tego samego opisu otwartego pliku, dzieląc zatem te same znaczniki
       stanu pliku.

       Znaczniki stanu pliku i ich znaczenie są opisane w open(2).

       F_GETFL (void)
              Zwraca (jako wynik funkcji) tryb dostępu do pliku i znaczniki stanu pliku, arg jest ignorowany.

       F_SETFL (int)
              Ustawia znaczniki stanu pliku na wartości określone przez arg. W arg ignorowane są:  tryb  dostępu
              do  pliku  (O_RDONLY,  O_WRONLY,  O_RDWR)  oraz  znaczniki  tworzenia  pliku (tj. O_CREAT, O_EXCL,
              O_NOCTTY, O_TRUNC). W Linuksie, operacja ta może  zmienić  jedynie  znaczniki  O_APPEND,  O_ASYNC,
              O_DIRECT,  O_NOATIME  i  O_NONBLOCK.  Nie da się zmienić znaczników O_DSYNC i O_SYNC; zob. USTERKI
              niżej.

   Blokowanie doradcze rekordów
       Linux implementuje tradycyjne („powiązane z procesem”)  blokady  rekordów  UNIX,  zgodnie  ze  standardem
       POSIX.  Istnieje  również  typowo  linuksowa  alternatywa  używająca  lepszej  semantyki — blokady opisów
       otwartego pliku, które są opisane nieco niżej.

       F_SETLK, F_SETLKW i F_GETLK służą do zakładania,  zwalniania  i  sprawdzania  obecności  blokad  rekordów
       (znanych również jako blokady zakresu bajtów, segmentów pliku lub obszarów pliku). Trzeci argument, lock,
       jest wskaźnikiem do struktury zawierającej co najmniej następujące pola (kolejność nie jest określona).

           struct flock {
               ...
               short l_type;    /* Rodzaj blokady: F_RDLCK,
                                   F_WRLCK, F_UNLCK */
               short l_whence;  /* Sposób interpretacji l_start:
                                   SEEK_SET, SEEK_CUR, SEEK_END */
               off_t l_start;   /* Początek (przesunięcie) blokady */
               off_t l_len;     /* Liczba blokowanych bajtów */
               pid_t l_pid;     /* PID procesu uniemożliwiającego blokadę
                                   (ustawiane przez F_GETLK i F_OFD_GETLK) */
               ...
           };

       Pola l_whence, l_start i l_len w tej strukturze określają zakres bajtów, które  mają  ulec  zablokowaniu.
       Bajty po końcu pliku mogą być blokowane, nie mogą to być natomiast bajty przed jego początkiem.

       l_start  jest  początkowym  przesunięciem  blokady i jest interpretowane w odniesieniu do: początku pliku
       (gdy l_whence wynosi SEEK_SET), bieżącego przesunięcia pliku (gdy l_whence wynosi  SEEK_CUR)  albo  końca
       pliku  (gdy  l_whence  wynosi  SEEK_END).  W  ostatnich dwóch przypadkach, l_start może być liczbą ujemną
       zakładając, że przesunięcie nie prowadzi przed początek pliku.

       l_len określa liczbę bajtów do zablokowania. Jeśli l_len jest  dodatnie,  to  przedział  do  zablokowania
       pokrywa bajty od l_start do l_start+l_len-1 włącznie. Podanie 0 w l_len ma specjalne znaczenie: blokowane
       są wszystkie bajty od położenia określonego przez l_whence i l_start, aż do końca pliku,  niezależnie  od
       tego, jak duży staje się plik.

       POSIX.1-2001 zezwala implementacji (lecz tego nie wymaga) na obsługę ujemnych wartości l_len; jeśli l_len
       jest ujemna, to przedział, którego dotyczy lock obejmuje bajty od l_start+l_len  do  l_start-1  włącznie.
       Jest to obsługiwane od Linuksa 2.4.21 i Linuksa 2.5.49.

       Pole  l_type  może  służyć  do założenia blokady dla odczytu (F_RDLCK) lub dla zapisu (F_WRLCK) do pliku.
       Dowolna liczba procesów może utrzymywać blokadę  dla  odczytu  pliku  (blokada  wspólna)  w  pewnym  jego
       obszarze,  ale tylko jeden proces może utrzymywać blokadę dla zapisu do pliku (blokada wyłączna). Blokada
       wyłączna wyklucza wszelkie inne blokady, zarówno wspólne, jak i wyłączne. Pojedynczy proces może w  danym
       obszarze  pliku utrzymywać blokadę tylko jednego rodzaju; gdy w aktualnie zablokowanym obszarze zakładana
       jest nowa blokada, to istniejąca blokada jest przekształcana w blokadę nowego typu (takie przekształcenie
       może  pociągać  za  sobą podział, skrócenie lub połączenie z istniejącą blokadą, gdy zakres bajtów podany
       dla nowej blokady nie pokrywa się dokładnie z zakresem istniejącej blokady).

       F_SETLK (struct flock *)
              Ustawienie blokady dla zakresu bajtów określonego przez pola l_whence, l_start i l_len  lock  (gdy
              l_type  jest równe F_RDLCK lub F_WRLCK) albo jej zwolnienie (gdy l_type jest równe F_UNLCK). Jeśli
              kolidująca blokada jest utrzymywana przez inny proces, funkcja ta zwraca -1 i  ustawia   errno  na
              EACCES lub EAGAIN (zwracany w tym przypadku błąd różni się pomiędzy implementacjami, dlatego POSIX
              wymaga sprawdzania przez przenośne aplikacje obu wartości błędów).

       F_SETLKW (struct flock *)
              Podobne do F_SETLK, lecz w sytuacji, gdy na  pliku  założona  jest  kolidująca  blokada  czeka  na
              zwolnienie  tej  blokady.  Jeśli  podczas  oczekiwania  zostanie przechwycony sygnał, funkcja jest
              przerywana i (po powrocie z funkcji obsługi sygnału) powraca natychmiast (zwracając wartość  -1  i
              ustawiając errno na EINTR; zob. signal(7)).

       F_GETLK (struct flock *)
              Jako  argument lock tej funkcji określa blokadę, jaką chcielibyśmy założyć na pliku. Gdy założenie
              blokady jest możliwe, fcntl() w rzeczywistości jej nie zakłada, lecz zwraca F_UNLCK w polu  l_type
              struktury lock pozostawiając inne pola tej struktury niezmienione.

              Jeśli jedna lub więcej niezgodnych blokad zapobiegłoby umieszczeniu tej blokady, to fcntl() zwróci
              szczegóły o jednej z tych blokad w  polach  l_type,  l_whence,  l_start  i  l_len  w  lock.  Jeśli
              niezgodna  blokada  jest  tradycyjną  (związaną  z  procesem)  blokadą rekordu, to pole l_pid jest
              ustawiane na PID procesu utrzymującego tę blokadę. Jeśli  niezgodna  blokada  jest  blokadą  opisu
              otwartego  pliku  (OFD), to l_pid jest ustawiane na -1. Proszę zauważyć, że w momencie sprawdzenia
              zwracanych informacji przez wywołującego, mogą być już one nieaktualne.

       Aby założyć blokadę do odczytu, deskryptor fd musi być otwarty do odczytu. Aby założyć blokadę do zapisu,
       deskryptor  fd  musi  być  otwarty  do zapisu. Aby założyć obydwa rodzaje blokad, należy otworzyć plik do
       odczytu i zapisu.

       Przy umieszczaniu blokady z F_SETLKW, jądra wykrywa zakleszczenia, gdy żądania blokad  dwóch  lub  więcej
       procesów  są wzajemnie zablokowane przez blokady utrzymywane przez inne procesy. Przykładowo, przypuśćmy,
       że proces A utrzymuje blokadę zapisu na bajcie 100. pliku, a proces B utrzymuje blokadę zapisu na  bajcie
       200.  Jeśli  każdy  z  procesów spróbuje następnie zablokować bajt już zablokowany przez drugie proces za
       pomocą F_SETLKW, to — bez wykrywania zakleszczeń — oba procesy pozostałyby stale zablokowane. Jeśli jądro
       wykryje  takie zakleszczenie, to spowoduje natychmiastowe niepowodzenie jednego z żądań blokady, z błędem
       EDEADLK; aplikacja napotykająca na taki błąd powinna zwolnić niektóre  ze  swoich  blokad,  aby  pozwolić
       działać  inny  aplikacjom, przed ponowną próbą odzyskania wymaganych blokad. Wykrywane są również koliste
       zakleszczenia, z więcej niż dwoma procesami. Proszę jednak zauważyć, że algorytm  wykrywania  zakleszczeń
       jądra ma swoje ograniczenia, zob. USTERKI.

       Oprócz  usunięcia za pomocą wyraźnego F_UNLCK, blokady rekordów są zwalniane automatycznie po zakończeniu
       procesu.

       Blokady rekordów nie są dziedziczone przez procesy potomne poprzez fork(2), ale  są  zachowywane  poprzez
       execve(2).

       Ze  względu  na  wykonywane  przez  bibliotekę  stdio(3) buforowanie, należy unikać blokowania rekordów w
       połączeniu z funkcjami z tego pakietu; zamiast tego należy używać read(2) i write(2).

       Opisane wyżej blokady rekordów są związane z procesem (w przeciwieństwie do blokad opisu otwartego pliku,
       opisanych niżej). Ma to pewne niefortunne konsekwencje:

       •  Jeśli  proces  zamknie  dowolny  deskryptor odnoszący się do pliku, to zwalniane są wszystkie blokady,
          niezależnie od tego, na którym z deskryptorów pliku blokady te uzyskano.  Jest  to  złe:  oznacza,  że
          proces  może  utracić  swe  blokady  na  pliku  takim  jak /etc/passwd lub /etc/mtab gdy jakaś funkcja
          biblioteczna zdecyduje się z jakiegoś powodu otworzyć, odczytać i zamknąć ten sam plik.

       •  Wątki procesu dzielą blokady. Innymi słowy, program wielowątkowy nie może korzystać z blokad rekordów,
          aby uniemożliwić jednoczesny dostęp do tego samego miejsca pliku przez swoje wątki.

       Blokady opisu otwartego pliku rozwiązują oba te problemy.

   Blokady opisu otwartego pliku (spoza POSIX)
       Blokady opisu otwartego pliku są blokadami doradczymi, definiowanymi w zakresie bajtów, których działanie
       jest w większości identyczne do tradycyjnych blokad rekordów opisanych wyżej. Ten typ blokad jest  typowo
       linuksowy i jest dostępny od Linuksa 3.15 (w Austin Group istnieje propozycja włączenia tego typu blokady
       do następnej rewizji POSIX.1). Wyjaśnienie opisu otwartego pliku znajduje się w podręczniku open(2).

       Podstawową różnicą, pomiędzy dwoma typami blokad jest fakt, że  o  ile  tradycyjne  blokady  rekordów  są
       związane  z procesem, to blokady opisu otwartego pliku są związane z opisem otwartego pliku, na którym je
       uzyskano, podobnie jak to wygląda w przypadku blokad uzyskanych za pomocą flock(2).  W  efekcie  (inaczej
       niż  przy  tradycyjnych blokadach doradczych rekordów) blokady opisu otwartego pliku są dziedziczone przy
       fork(2) (i clone(2)  ze  znacznikiem  CLONE_FILES),  a  także  są  automatycznie  zwalniane  po  ostatnim
       zamknięciu opisu otwartego pliku, zamiast zwalniania przy jakimkolwiek zamknięciu pliku.

       Kolidujące  kombinacje  blokad  (tj.  blokada odczytu z blokadą zapisu lub dwie blokady zapisu) gdy jedna
       blokada jest blokadą opisu otwartego pliku, a druga jest tradycyjną blokadą rekordu prowadzą do konfliktu
       nawet wówczas, gdy są uzyskane przez ten sam proces na tym samym deskryptorze pliku.

       Blokady  opisu otwartego pliku umieszczone na tym samym opisie otwartego pliku (tj. za pomocą tego samego
       deskryptora pliku lub za pomocą duplikatu deskryptora pliku utworzonego przez fork(2), dup(2), F_DUPFD  z
       fcntl()  itp.)  są  zawsze  kompatybilne: jeśli nowa blokada jest umieszczona na już zablokowanym rejonie
       pliku, to istniejące blokada jest konwertowana na nowy typ blokady (takie  konwersje  mogą  prowadzić  to
       podziału, zmniejszenia lub złączenia z dotychczasową blokadą, jak opisano to wyżej)

       Z  drugiej strony, blokady opisu otwartego pliku mogą być w konflikcie, gdy są uzyskane przez różne opisy
       otwartego pliku. Z tego względu, program wielowątkowy może korzystać z blokad opisu  otwartego  pliku  do
       synchronizowania  dostępu  do  jakiegoś  miejsca  w  pliku,  otwierając (open(2)) plik z różnych wątków i
       zakładając blokady za pomocą wynikowego deskryptora pliku.

       Podobnie jak w przypadku tradycyjnych  blokad  doradczych,  trzeci  argument  do  fcntl()  —  lock,  jest
       wskaźnikiem  do  struktury flock. W odróżnieniu do tradycyjnych blokad rekordów, pole l_pid tej struktury
       musi być ustawione na zero za pomocą operacji opisanych niżej.

       Operacje działające z blokadami opisu otwartego pliku są analogiczne do  tych  używanych  z  tradycyjnymi
       blokadami:

       F_OFD_SETLK (struct flock *)
              Ustawia  blokadę  opisu  otwartego  pliku (gdy l_type jest równe F_RDLCK lub F_WRLCK) albo zwalnia
              blokadę opisu otwartego pliku (gdy l_type jest równe F_UNLCK) dla zakresu bajtów określonego przez
              pola  l_whence, l_start i l_len lock. Jeśli kolidująca blokada jest utrzymywana przez inny proces,
              funkcja ta zwraca -1 i ustawia errno na EAGAIN.

       F_OFD_SETLKW (struct flock *)
              Podobne do F_SETLK, lecz w sytuacji, gdy na pliku  założona  jest  kolidująca  blokada,  czeka  na
              zwolnienie  tej  blokady.  Jeśli  podczas  oczekiwania  zostanie przechwycony sygnał, funkcja jest
              przerywana i (po powrocie z funkcji obsługi sygnału) powraca natychmiast (zwracając wartość  -1  i
              ustawiając errno na EINTR; zob. signal(7)).

       F_OFD_GETLK (struct flock *)
              Jako argument lock tej funkcji określa blokadę opisu otwartego pliku, jaką chcielibyśmy założyć na
              pliku. Gdy założenie blokady jest możliwe, fcntl() w rzeczywistości jej nie zakłada,  lecz  zwraca
              F_UNLCK  w polu l_type struktury lock pozostawiając inne pola tej struktury niezmienione. Jeśli co
              najmniej jedna niezgodna blokada uniemożliwiłaby założenie zadanej blokady, to informacje o jednej
              z tych blokad są zwracane za pomocą lock, jak to opisano powyżej dla F_GETLK.

       W  bieżącej  implementacji,  dla  blokad  opisu  otwartego  pliku  nie zachodzi wykrywanie zakleszczeń (w
       odróżnieniu od blokad rekordów związanych z procesem, dla których jądro wykonuje wykrywanie zakleszczeń).

   Blokowanie obowiązujące (przymusowe)
       Ostrzeżenie: linuksowa implementacja blokowania obowiązującego jest zawodna  (zob.  USTERKI  poniżej).  Z
       powodu  opisanych  błędów  i  faktu, że funkcjonalność ta nie była często wykorzystywana, od Linuksa 4.5,
       tego  typu  blokowanie  stało   się   opcjonalne   i   zależy   od   ustawienia   opcji   konfiguracyjnej
       (CONFIG_MANDATORY_FILE_LOCKING).  Od  Linuksa  5.15  blokowanie  obowiązujące (przymusowe) nie jest już w
       ogólne obsługiwane.

       Domyślnie, zarówno tradycyjne blokady (związane z procesem) jak i blokady opisu otwartego pliku (OFD)  są
       doradcze. Blokady doradcze nie są wymuszane i są przydatne tylko w przypadku współdziałających procesów.

       Oba  te  typy  mogą  być również obowiązujące. Blokady obowiązujące są wymuszane dla wszystkich procesów.
       Jeśli proces spróbuje uzyskać niezgodny dostęp (tj. odczyt — read(2) lub zapis  —  write(2))  w  obszarze
       pliku,  który  posiada  niezgodną  blokadę  obowiązującą,  to  wynik  zależy  od tego, czy dla jego opisu
       otwartego pliku włączono znacznik O_NONBLOCK. Jeśli  znacznik  O_NONBLOCK  nie  jest  włączony,  to  dane
       wywołanie  systemowe  jest  blokowane  do momentu usunięcia blokady lub jej przekształcenia w tryb, który
       jest zgodny z uzyskiwanym dostępem. Jeśli znacznik  O_NONBLOCK  jest  włączony,  to  wywołanie  systemowe
       zawodzi z błędem EAGAIN.

       Aby  skorzystać  z  obowiązujących  blokad, blokowanie obowiązujące musi być włączone zarówno na systemie
       plików zawierającym blokowany plik, jak i na samym  pliku.  Blokowanie  obowiązujące  w  systemie  plików
       włącza  się  za pomocą opcji „-o mand” programu mount(8) lub za pomocą znacznika MS_MANDLOCK do mount(8).
       Blokowanie obowiązujące na pliku włącza się poprzez wyłączenie prawa uruchamiania dla grupy  i  włączenie
       bitu set-group-ID (zob. chmod(1) i chmod(2)).

       Blokowanie  obowiązujące  nie  jest  określone  normą  POSIX.  Niektóre  inne  systemy  również obsługują
       blokowanie obowiązujące, choć szczegóły ich włączenia również się między systemami.

   Zagubione blokady
       Gdy blokada doradcza jest uzyskiwana na sieciowym systemie plików, takim jak NFS, możliwe jest zagubienie
       blokady.  Może  się  tak  stać  ze względu na działanie administracyjne na serwerze lub z powodu podziału
       sieci (tzn. utraty połączenie z serwerem), które będzie trwało na tyle długo, że serwer może przyjąć brak
       dalszego funkcjonowania przez klienta.

       Gdy system plików stwierdzi, że blokada została zagubiona, przyszły odczyt (read(2)) lub zapis (write(2))
       może zawieść z błędem EIO. Błąd ten  będzie  występował  do  momentu  usunięcia  blokady  lub  zamknięcia
       deskryptora  pliku. Od Linuksa 3.12, dzieje się tak przynajmniej w NFSv4 (we wszystkich jego pomniejszych
       wydaniach).

       Niektóre wersje Uniksa wysyłają w takiej sytuacji sygnał (SIGLOST). Linux nie definiuje  tego  sygnału  i
       nie zapewnia żadnego asynchronicznego powiadamiania o zagubionych blokadach.

   Zarządzanie sygnałami
       F_GETOWN,  F_SETOWN,  F_GETOWN_EX,  F_SETOWN_EX,  F_GETSIG  i  F_SETSIG  służą  do  zarządzania sygnałami
       dostępności wejścia/wyjścia:

       F_GETOWN (void)
              Zwraca (jako wynik funkcji) identyfikator  procesu  lub  identyfikator  grupy  procesów  aktualnie
              otrzymujących  sygnały  SIGIO  i  SIGURG  dla  zdarzeń  na  deskryptorze plików fd. Identyfikatory
              procesów są zwracane jako wartości  dodatnie,  identyfikatory  grupy  procesów  są  zwracane  jako
              wartości ujemne (lecz zob. USTERKI poniżej). arg jest ignorowane.

       F_SETOWN (int)
              Ustawia  identyfikator  procesu  lub  identyfikator grupy procesów aktualnie otrzymujących sygnały
              SIGIO i SIGURG dla zdarzeń na deskryptorze plików fd. Docelowy  identyfikator  procesu  lub  grupy
              procesów  podaje  się  jako  arg.  Identyfikator  procesu  jest  określany  jako  liczba dodatnia;
              identyfikator grupy procesów jest określany  za  pomocą  wartości  ujemnych.  Najczęściej,  proces
              wywołujący określa się jako właściciel (tj. arg jest podawany jak przez getpid(2)).

              Oprócz  ustawiania  właściciela  deskryptora  pliku,  konieczne jest również włączenie generowania
              sygnałów na deskryptorze plików. Można to uczynić za pomocą operacji F_SETFL  fcntl(),  ustawiając
              znacznik  stanu  pliku  O_ASYNC  na deskryptorze pliku. Co za tym idzie, gdy tylko na deskryptorze
              pliku możliwe stanie się wejście lub wyjście, zostanie wysłany  sygnał  SIGIO.  Operację  F_SETSIG
              fcntl() można wykorzystać do uzyskania dostarczenia sygnału innego niż SIGIO.

              Wysłanie  sygnału  do  właściciela  procesu  (grupy)  podanego  w  F_SETOWN,  podlega  takim samym
              sprawdzeniom uprawnień jak opisano w przypadku kill(2), gdy  proces  wysyłający  jest  tym,  który
              używa  F_SETOWN  (lecz  zob.  USTERKI  poniżej). Jeśli sprawdzenie uprawnień się nie powiedzie, to
              sygnał jest po cichu odrzucany. Uwaga: Operacja F_SETOWN  sprawdza  poświadczenia  wywołującego  w
              chwili wywołania fcntl() i to te zapisane poświadczenia są używane do sprawdzenia uprawnień.

              Jeśli deskryptor pliku fd odnosi się do gniazda, F_SETOWN określa również odbiorcę sygnałów SIGURG
              dostarczanych gdy poprzez gniazdo przybędą dane autonomiczne (SIGURG jest wysyłany w sytuacjach, w
              których select(2) zgłosiłby „stan wyjątkowy”).

              Następujący akapit był prawdziwy w Linuksie 2.6.x do Linuksa 2.6.11 włącznie:

                     Jeśli  F_SETSIG  przekaże  się  wartość  niezerową  w procesie wielowątkowym, działającym z
                     biblioteką wątkowania obsługującą grupy wątków (np. NPTL), to wartość pozytywna  przekazana
                     F_SETOWN   ma   inne   znaczenie:  zamiast  byciem  identyfikatorem  całego  procesu,  jest
                     identyfikatorem wątku, który identyfikuje dany wątek procesu. W efekcie, może być konieczne
                     podanie  F_SETOWN  wyniku gettid(2), zamiast wyniku getpid(2), aby uzyskać rozsądne wyniki,
                     gdy korzysta się z F_SETSIG (w bieżącej, linuksowej implementacji wątkowania, identyfikator
                     głównego  wątku  jest  taki  sam  jak  jego  identyfikator procesu; oznacza to, że programy
                     jednowątkowe mogą w tym scenariuszu korzystać z gettid(2)  lub  getpid(2)).  Proszę  jednak
                     zauważyć,  że  stwierdzenie  w  tym akapicie nie dotyczy sygnału SIGURG, wygenerowanego dla
                     danych spoza pasma (ang. out-of-band data) na gnieździe: ten sygnał zawsze trafia  albo  do
                     procesu albo do grupy procesu, w zależności od wartości przekazanej F_SETOWN.

              Powyższe zachowanie przypadkowo porzucono w Linuksie 2.6.12 i nie zostanie przywrócone. Od Linuksa
              2.6.32, należy użyć F_SETOWN_EX, aby przeznaczyć sygnały SIGIO do określonego wątku.

       F_GETOWN_EX (struct f_owner_ex *) (od Linuksa 2.6.32)
              Zwraca ustawienia aktualnego właściciela deskryptora pliku, jak zdefiniowane  poprzednią  operacją
              F_SETOWN_EX. Informacja ta jest zwracana przez strukturę na którą wskazuje arg, która ma postać:

                  struct f_owner_ex {
                      int   type;
                      pid_t pid;
                  };

              Pole  type będzie miało jedną z wartości: F_OWNER_TID, F_OWNER_PID lub F_OWNER_PGRP. Pole pid jest
              liczbą dodatnią, reprezentującą identyfikator, odpowiednio,  wątku,  procesu  lub  grupy  procesu.
              Więcej informacji przy F_SETOWN_EX.

       F_SETOWN_EX (struct f_owner_ex *) (od Linuksa 2.6.32)
              Operacja  przeprowadza podobne zadanie do F_SETOWN. Pozwala wywołującemu, na kierowanie sygnałów o
              dostępności wejścia/wyjścia do określonego wątku, procesu lub grupy  procesu.  Wywołujący  określa
              cel  sygnału  za pomocą arg, wskaźnika do struktury f_owner_ex. Pole type ma jedną z następujących
              wartości, definiujących sposób interpretacji pid:

              F_OWNER_TID
                     Wysyła sygnał do wątku, którego identyfikator wątku (taki,  jak  zwracany  przez  wywołanie
                     clone(2) lub gettid(2)) podano w pid.

              F_OWNER_PID
                     Wysyła sygnał do procesu, którego identyfikator podano w pid.

              F_OWNER_PGRP
                     Wysyła  sygnał  do  grupy procesu, której identyfikator podano w pid (proszę zauważyć, że w
                     przeciwieństwie do F_SETOWN, identyfikator grupy procesu  jest  tu  podawany  jako  wartość
                     dodatnia).

       F_GETSIG (void)
              Zwraca  (jako  wynik funkcji) sygnał wysyłany, gdy wejście lub wyjście stanie się możliwe. Wartość
              zerowa oznacza wysyłanie SIGIO. Dowolna inna wartość  (łącznie  z  SIGIO)  stanowi  numer  sygnału
              wysyłanego  zamiast  niego.  W tych sytuacjach dodatkowe informacje mogą być dostępne dla programu
              obsługi sygnału, o ile zostały zainstalowane z użyciem SA_SIGINFO. arg jest ignorowane.

       F_SETSIG (int)
              Ustawia sygnał wysyłany, gdy wejście lub wyjście stanie się  możliwe  na  wartość  podaną  w  arg.
              Wartość  zerowa oznacza wysyłanie sygnału domyślnego, czyli SIGIO. Dowolna inna wartość (łącznie z
              SIGIO) stanowi numer sygnału wysyłanego zamiast niego. W tych sytuacjach dodatkowe informacje mogą
              być dostępne dla programu obsługi sygnału, o ile zostały zainstalowane z użyciem SA_SIGINFO.

              Za pomocą F_SETSIG z niezerową wartością i przy ustawionym SA_SIGINFO dla programu obsługi sygnału
              (patrz sigaction(2)), można przekazać do programu obsługi sygnału w strukturze siginfo_t dodatkowe
              informacje  o  zdarzeniach wejścia/wyjścia. Jeśli pole si_code wskazuje, że źródłem jest SI_SIGIO,
              to pole si_fd zawiera deskryptor pliku związany ze zdarzeniem. W przeciwnym przypadku,  brak  jest
              wskazania,  które  deskryptory  plików  oczekują  i  do  określenia dostępnych dla wejścia/wyjścia
              deskryptorów plików należy używać zwykłych mechanizmów (select (2), poll(2), read(2) z  ustawionym
              O_NONBLOCK itd.).

              Proszę  zauważyć,  że  deskryptor  pliku udostępniony w si_fd jest tym samym, który podano podczas
              operacji F_SETSIG. To może prowadzić do nietypowej sytuacji. Gdy deskryptor pliku jest duplikowany
              (dup(2)  lub  podobne),  a  pierwotny deskryptor pliku jest zamykany, to zdarzenie wejście/wyjścia
              wciąż będzie tworzone, lecz pole si_fd będzie zawierać deskryptor już zamkniętego pliku.

              Wybierając sygnał czasu rzeczywistego (wartość >= SIGRTMIN), można, używając tych  samych  numerów
              sygnałów,  spowodować umieszczenie w kolejce wielu zdarzeń wejścia/wyjścia (kolejkowanie zależy od
              dostępnej pamięci). Jak powyżej, dodatkowe informacje są dostępne, gdy programy  obsługi  sygnałów
              zostały zainstalowane z ustawionym SA_SIGINFO.

              Proszę  zauważyć, że Linux narzuca limit liczby sygnałów czasu rzeczywistego, które mogą oczekiwać
              w kolejce na proces (zob. getrlimit(2) i signal(7)) i jeśli  limit  ten  zostanie  osiągnięty,  to
              jądro  powraca  do dostarczania SIGIO, a sygnał ten jest dostarczany do całego procesu, zamiast to
              konkretnego wątku.

       Za pomocą tych mechanizmów program może  zaimplementować  w  pełni  asynchroniczne  wejście/wyjście,  nie
       używając przez większość czasu select(2) i poll(2).

       Opisane  powyżej  korzystanie  z  O_ASYNC  jest specyficzne dla BSD i Linuksa. Jedynym użyciem F_GETOWN i
       F_SETOWN podanym w POSIX.1 jest użycie ich w połączeniu z sygnałem SIGURG na gniazdach (POSIX nie określa
       sygnału  SIGIO).  F_GETOWN_EX,  F_SETOWN_EX,  F_GETSIG  i  F_SETSIG  są  typowo  linuksowe. POSIX posiada
       asynchroniczne wejście/wyjście i strukturę aio_sigevent służącą do podobnych celów;  w  Linuksie  są  one
       również dostępne jako część biblioteki GNU C (glibc).

   Dzierżawy
       F_SETLEASE  i F_GETLEASE (od Linuksa 2.4 wzwyż) służą do ustanowienia nowe dzierżawy i pobrania aktualnej
       dzierżawy na opisie otwartego pliku, do którego odnosi się deskryptor pliku fd. Dzierżawa pliku  zapewnia
       mechanizm,  w  którym proces utrzymujący dzierżawę („dzierżawca”) jest zawiadamiany (poprzez dostarczenie
       sygnału) o tym, że inny proces („zrywający dzierżawę”) próbuje wykonać open(2) lub truncate(2) na  pliku,
       do którego odnosi się dany deskryptor pliku.

       F_SETLEASE (int)
              Ustawia  lub  usuwa  dzierżawę pliku w zależności od tego, która z następujących wartości zostanie
              podana jako argument arg typu integer :

              F_RDLCK
                     Ustanawia dzierżawę odczytu. Spowoduje to zawiadamianie  procesu  wywołującego  o  otwarciu
                     pliku  do  zapisu  lub o obcinaniu go. Dzierżawa odczytu może zostać nałożona na deskryptor
                     pliku tylko wtedy, gdy jest on otwarty tylko do odczytu.

              F_WRLCK
                     Ustanawia dzierżawę zapisu. Spowoduje to zawiadamianie wywołującego  o  otwarciu  pliku  do
                     odczytu  lub  do  zapisu, lub o obcinaniu go. Dzierżawa zapisu może zostać nałożona na plik
                     tylko wtedy, gdy plik nie posiada żadnych innych otwartych deskryptorów pliku.

              F_UNLCK
                     Zdejmuje własną dzierżawę z pliku.

       Dzierżawy są związane z opisem otwartego pliku (zob. open(2)). Oznacza to,  że  zduplikowane  deskryptory
       pliku  (utworzone  np.  za  pomocą  fork(2)  lub  dup(2))  odnoszą  się do tej samem dzierżawy i można ją
       zmodyfikować lub zwolnić za pomocą dowolnego z tych deskryptorów. Co  więcej,  dzierżawa  jest  zwalniana
       przez  operację  F_UNLCK  na  dowolnym z tych zduplikowanych deskryptorów plików albo gdy wszystkie takie
       deskryptory pliku zostaną zamknięte.

       Dzierżawy można ustanawiać tylko na zwykłych plikach. Proces nieuprzywilejowany może  ustanawiać  jedynie
       dzierżawy  na  plikach,  których  UID  (właściciela) odpowiada UID-owi systemu plików dla danego procesu.
       Proces z przywilejem CAP_LEASE (ang. capability) może ustanawiać dzierżawy na dowolnych plikach.

       F_GETLEASE (void)
              Wskazuje rodzaj dzierżawy związanej z deskryptorem pliku  fd,  zwracając  F_RDLCK,  F_WRLCK,  albo
              F_UNLCK,  wskazując  (odpowiednio)  dzierżawę:  odczytu,  zapisu  lub  brak  dzierżawy.  arg  jest
              ignorowane.

       Gdy proces („zrywający dzierżawę”)  wykona  operację  open(2)  lub  truncate(2)  kolidującą  z  dzierżawą
       ustanowioną  poprzez  F_SETLEASE,  wywołanie  funkcji  systemowej  jest  blokowane  przez  jądro, a jądro
       zawiadamia dzierżawcę poprzez wysłanie sygnału (domyślnie SIGIO).  Dzierżawca  powinien  odpowiedzieć  na
       otrzymanie tego sygnału wykonując porządki niezbędne dla przygotowania pliku do dostępu przez inny proces
       (np. zrzucenie buforów) a następnie usunięcie lub zmniejszenie swojej dzierżawy. Dzierżawa  jest  usuwana
       poprzez  wykonanie  operacji  F_SETLEASE  podając  jako arg F_UNLCK. Jeśli dzierżawca aktualnie utrzymuje
       dzierżawę zapisu na pliku,  a  zrywający  dzierżawę  otwiera  plik  do  odczytu,  to  wystarczające  jest
       zmniejszenie  dzierżawy  przez  dzierżawcę  do  dzierżawy  odczytu.  Dokonuje  się tego poprzez wykonanie
       operacji F_SETLEASE podając jako arg F_RDLCK.

       Jeśli dzierżawca nie zmniejszy lub nie zwolni dzierżawy w ciągu podanej  w  /proc/sys/fs/lease-break-time
       liczby sekund, to jądro przymusowo usunie lub zmniejszy dzierżawę dzierżawcy.

       Po  zainicjowaniu  zerwania  dzierżawy, F_GETLEASE zwraca docelowy typ dzierżawy (F_RDLCK albo F_UNLCK, w
       zależności od tego, co byłoby zgodne ze zrywającym dzierżawę) do momentu, gdy dzierżawca dobrowolnie  nie
       zmniejszy  lub  nie  zwolni  dzierżawy  albo  do  momentu,  gdy jądro tego nie wymusi po upłynięciu czasu
       zerwania dzierżawy.

       Po dobrowolnym lub wymuszonym usunięciu lub zmniejszeniu dzierżawy, przy założeniu, że wywołanie  funkcji
       systemowej  przez  zrywającego  dzierżawę  nie  jest  nieblokujące,  jądro pozwala na kontynuację funkcji
       systemowej wywołanej przez zrywającego dzierżawę.

       Jeśli zablokowane wywołanie open(2)  lub  truncate(2)  zrywającego  dzierżawę  zostanie  przerwane  przez
       procedurę  obsługi  sygnału,  to  wywołanie  systemowe  zawiedzie z błędem EINTR, lecz inne kroki opisane
       wyżej, wciąż zostaną przeprowadzone.  Jeśli  zrywający  dzierżawę  zostanie  zabity  sygnałem  w  trakcie
       blokowania  open(2)  lub  truncate(2),  to  inne kroki opisane wyżej, wciąż zostaną przeprowadzone. Jeśli
       zrywający dzierżawę poda znacznik O_NONBLOCK przy wywoływaniu open(2), to wywołanie zawiedzie natychmiast
       z błędem EWOULDBLOCK, lecz inne kroki opisane wyżej, wciąż zostaną przeprowadzone.

       Domyślnym  sygnałem  stosowanym  do  zawiadamiania dzierżawcy jest SIGIO, lecz można go zmienić za pomocą
       operacji F_SETSIG w fcntl(). Jeśli wydano operację F_SETSIG (nawet  podając  SIGIO),  a  funkcja  obsługi
       sygnału  została  określona  za  pomocą  SA_SIGINFO,  to  ta  funkcja obsługi otrzyma jako drugi argument
       strukturę siginfo_t, której pole si_fd będzie zawierać deskryptor pliku dzierżawionego pliku, do  którego
       uzyskuje dostęp inny proces (jest to przydatne, gdy wywołujący utrzymuje dzierżawy na wielu plikach).

   Powiadamianie o zmianach pliku lub katalogu (dnotify)
       F_NOTIFY (int)
              (od Linuksa 2.4 wzwyż) Zapewnia powiadamianie o modyfikacji katalogu, do którego odnosi się fd lub
              o modyfikacji któregokolwiek z plików w  tym  katalogu.  Zdarzenia,  powiadamianie  o  których  ma
              nastąpić,  są  określone  w  arg,  będącym maską bitową utworzoną jako suma logiczna (OR) zera lub
              więcej spośród następujących bitów:

              DN_ACCESS
                     Uzyskano dostęp do pliku (read(2), pread(2), readv(2) i podobne)
              DN_MODIFY
                     Plik został zmodyfikowany (write(2),  pwrite(2),  writev(2),  truncate(2),  ftruncate(2)  i
                     podobne).
              DN_CREATE
                     Utworzono plik (open(2), creat(2), mknod(2), mkdir(2), link(2), symlink(2), rename(2) w tym
                     katalogu).
              DN_DELETE
                     Usunięto pliku (unlink(2), rename(2) do innego katalogu, rmdir(2)).
              DN_RENAME
                     Zmieniono nazwę w obrębie katalogu (rename(2)).
              DN_ATTRIB
                     Zmieniono atrybuty pliku (chown(2), chmod(2), utime(2), utimensat(2) i podobne).

              (Uzyskanie tych definicji wymaga zdefiniowania makra sprawdzania cech _GNU_SOURCE przed włączeniem
              jakichkolwiek plików nagłówkowych).

              Powiadomienia  dotyczące  katalogów  są  zazwyczaj  jednorazowe,  więc aplikacja musi się ponownie
              zarejestrować,  aby  otrzymać  dalsze  powiadomienia.  Alternatywnie,   jeśli   w   arg   włączono
              DN_MULTISHOT, to powiadomienia będą dokonywane aż do ich jawnego usunięcia.

              Szereg  wywołań  podających  DN_MULTISHOT  kumuluje  się,  przy  czym  zdarzenia w arg są dodawane
              logicznie do już monitorowanych. Aby wyłączyć powiadamianie o jakichkolwiek zdarzeniach, należy  w
              wywołaniu F_NOTIFY podać arg równe 0.

              Powiadamianie odbywa się poprzez dostarczenie sygnału. Domyślnym sygnałem jest SIGIO, ale można go
              zmienić za pomocą operacji F_SETSIG w fcntl() (proszę zauważyć, że SIGIO jest  jednym  z  sygnałów
              standardowych  niepodlegających  kolejkowaniu;  przełączenie  się  na  sygnały czasu rzeczywistego
              oznacza, że do procesu może być kolejkowane wiele zawiadomień). W tym  drugim  przypadku,  funkcja
              obsługi  sygnału  otrzymuje  jako  swój  drugi  argument  strukturę siginfo_t (gdy funkcja obsługi
              sygnału została określona za pomocą SA_SIGINFO) a pole  si_fd  tej  struktury  zawiera  deskryptor
              pliku,   który  spowodował  powiadomienie  (przydatne,  gdy  utrzymywane  są  dzierżawy  na  wielu
              katalogach).

              W szczególności, gdy używa się DN_MULTISHOT, do zawiadamiania powinien być stosowany sygnał  czasu
              rzeczywistego, tak aby można było kolejkować wiele zmian.

              UWAGA: Nowe aplikacje powinny korzystać z interfejsu inotify (dostępnego od Linuksa 2.6.13), który
              zapewnia o wiele lepszy interfejs do uzyskiwania powiadomień o zdarzeniach w systemie plików. Zob.
              inotify(7).

   Zmiana pojemności potoku
       F_SETPIPE_SZ (int; od Linuksa 2.6.35)
              Zmienia   pojemność  potoku,  do  którego  odnosi  się  fd  na  co  najmniej  arg  bajtów.  Proces
              nieuprzywilejowany może  dostosować  pojemność  potoku  na  dowolną  wartość  pomiędzy  systemowym
              rozmiarem  strony  i  limitem  zdefiniowanym  w  /proc/sys/fs/pipe-max-size  (zob. proc(5)). Próby
              ustawienia pojemności potoku poniżej rozmiaru strony są po cichu zaokrąglane w górę,  do  rozmiaru
              strony.   Próby   ustawienia  przez  proces  nieuprzywilejowany  rozmiaru  potoku  powyżej  limitu
              /proc/sys/fs/pipe-max-size prowadzą do błędu EPERM; proces uprzywilejowany (CAP_SYS_RESOURCE) może
              przesłonić ten limit.

              Przy  przydzielaniu  bufora  dla  potoku, jądro może użyć pojemności większej niż arg, gdy jest to
              wygodne ze  względu  na  implementację  (w  bieżącej  implementacji,  przydzielanie  następuje  do
              następnej  wielokrotności  będącej  potęgą  dwójki,  w stosunku do żądanego rozmiaru). Rzeczywista
              ustawiona pojemność (w bajtach) jest zwracana jako wynik funkcji.

              Próby ustawienia pojemności potoku poniżej  aktualnie  używanego  rozmiaru  bufora,  używanego  do
              przechowywania jego danych, poskutkuje błędem EBUSY.

              Proszę  zauważyć,  że  ze  względu  na sposób, w jaki wykorzystywane są strony bufora potoku, przy
              zapisywaniu danych do potoku, liczba możliwych do zapisanych bajtów może być  mniejsza,  niż  jego
              nominalny rozmiar, zależnie od rozmiaru zapisów.

       F_GETPIPE_SZ (void; od Linuksa 2.6.35)
              Zwraca (jako wynik funkcji) rozmiar potoku, do którego odnosi się fd.

   Pieczętowanie pliku (ang. file sealing)
       Pieczęcie pliku ograniczają zestaw dozwolonych operacji na danym pliku. Od momentu ustawienia pieczęci na
       pliku, określony zestaw operacji na tym pliku zawiedzie z błędem EPERM. Taki  plik  określany  jest  jako
       zapieczętowany  (ang.  sealed).  Domyślny zestaw pieczęci zależy od typu pliku i systemu plików. Przegląd
       pieczętowania plików, opis celowości i nieco przykładów kodu zawarto w podręczniku memfd_create(2).

       Obecnie, pieczęcie pliku można zastosować tylko na deskryptorze  pliku  zwróconym  przez  memfd_create(2)
       (jeśli  użyto  MFD_ALLOW_SEALING).  W  innych  systemach plików, wszystkie operacje fcntl() działające na
       pieczęciach zwrócą EINVAL.

       Pieczęcie są właściwością i-węzła. Z tego powodu, wszystkie opisy otwartego pliku (OFD) odnoszące się  do
       tego  samego i-węzła dzielą ten sam zestaw pieczęci. Co więcej, pieczęci nigdy nie można usunąć, można je
       jedynie dodawać.

       F_ADD_SEALS (int; od Linuksa 3.17)
              Dodaje pieczęcie przekazane w argumencie arg, będącym maską bitową, do zestawu  pieczęci  i-węzła,
              do  którego  odnosi  się  deskryptor  pliku  fd.  Pieczęci  nie  można usunąć. Jeśli wywołanie się
              powiedzie, pieczęcie są natychmiast stosowane przez jądro. Jeśli aktualny zestaw pieczęci obejmuje
              F_SEAL_SEAL  (zob.  niżej),  to  wywołanie to zostanie odrzucone z błędem EPERM. Dodanie pieczęci,
              która jest już ustawiona nie ma skutku, o ile nie ustawiono F_SEAL_SEAL. Do umieszczenia pieczęci,
              deskryptor pliku fd musi być zapisywalny.

       F_GET_SEALS (void; od Linuksa 3.17)
              Zwraca  (jako  wynik funkcji) bieżący zestaw pieczęci i-węzła, do którego odnosi się fd. Jeśli nie
              ma ustawionych pieczęci, zwracane jest 0. Jeśli plik nie obsługuje  pieczętowania,  zwracane  jest
              -1, a errno jest ustawiane na EINVAL.

       Dostępne są następujące pieczęcie:

       F_SEAL_SEAL
              Jeśli  ta pieczęć jest ustawiona, każde kolejne wywołanie fcntl() z F_ADD_SEALS zawiedzie z błędem
              EPERM. Ta pieczęć zapobiega zatem wszelkim modyfikacjom samego zestawu pieczęci. Jeśli  początkowy
              zestaw  pieczęci  pliku  obejmuje  F_SEAL_SEAL,  to  powoduje  to  efektywne  ustawienie stałego i
              zablokowanego zestawu pieczęci.

       F_SEAL_SHRINK
              Jeśli ta pieczęć jest ustawiona, rozmiar przedmiotowego pliku nie może ulec zmniejszeniu.  Dotyczy
              to  open(2)  ze  znacznikiem  O_TRUNC,  jak również truncate(2) i ftruncate(2). Jeśli spróbuje się
              zmniejszyć zapieczętowany w ten sposób plik, wywołania te  zawiodą  z  błędem  EPERM.  Zwiększenie
              rozmiaru pliku jest wciąż możliwe.

       F_SEAL_GROW
              Jeśli  ta  pieczęć jest ustawiona, rozmiar przedmiotowego pliku nie może ulec zwiększeniu. Dotyczy
              to zapisu za pomocą write(2) poza koniec pliku, truncate(2), ftruncate(2) oraz fallocate(2). Jeśli
              spróbuje  się  zwiększyć  zapieczętowany  w  ten sposób plik, wywołania te zawiodą z błędem EPERM.
              Jeśli rozmiar pliku nie zmieni się lub ulegnie  zmniejszeniu,  opisywane  wywołania  będą  działać
              zgodnie z oczekiwaniami.

       F_SEAL_WRITE
              Jeśli  ta pieczęć jest ustawiona, nie można modyfikować zawartości pliku. Proszę zwrócić uwagę, że
              zmniejszenie lub zwiększenie rozmiaru pliku jest  wciąż  możliwe  i  dozwolone.  Z  tego  względu,
              pieczęć  ta  jest  zwykle  używana w połączeniu z innymi pieczęciami. Pieczęć wpływa na write(2) i
              fallocate(2)  (tylko  w  połączeniu  ze  znacznikiem  FALLOC_FL_PUNCH_HOLE).  Jeśli  pieczęć  jest
              ustawiona,  wywołania  te  zawiodą  z  błędem  EPERM.  Co  więcej,  utworzenie  nowego  wspólnego,
              zapisywalnego przypisania pamięci za pomocą mmap(2) również zawiedzie z błędem EPERM.

              Użycie operacji F_ADD_SEALS do ustawienia pieczęci F_SEAL_WRITE zawiedzie z  błędem  EBUSY,  jeśli
              istnieją  zapisywalne, wspólne przypisania pamięci. Przed dodaniem tej pieczęci konieczne jest ich
              odmapowanie. Ponadto,  jeśli  wobec  pliku  istnieją  jakieś  oczekujące  asynchroniczne  operacje
              wejścia/wyjścia (io_submit(2)), to wszystkie pozostałe zapisy zostaną odrzucone.

       F_SEAL_FUTURE_WRITE (od Linuksa 5.1)
              Skutek  zastosowania  tej  pieczęci jest podobny do F_SEAL_WRITE, lecz zawartość pliku można wciąż
              zmodyfikować  za  pomocą  wspólnych,  zapisywalnych  przypisań  pamięci,  które  utworzono   przed
              ustawieniem  pieczęci.  Próba  utworzenia  nowego  zapisywalnego  przypisania  na  pliku za pomocą
              mmap(2), zawiedzie z błędem EPERM. Podobnie, próba zapisu do  pliku  za  pomocą  write(2)  również
              zawiedzie z błędem EPERM.

              Korzystając  z  tej  pieczęci,  proces  może  utworzyć  bufor  pamięci,  który  będzie  mógł wciąż
              modyfikować, dzieląc go jednocześnie na zasadzie „tylko do odczytu” z innymi procesami.

   Wskazówki odczytu/zapisu pliku
       Do poinformowania jądra o oczekiwanym, względnym czasie istnienia zapisów do danego i-węzła lub za pomocą
       opisu otwartego pliku (OFD; więcej informacji o opisach otwartego pliku w podręczniku open(2)) można użyć
       wskazówek czasu istnienia zapisu. W tym kontekście, pojęcie „czas istnienia  zapisu”  oznacza  oczekiwany
       czas, jaki dane będą istniały na nośniku, przed ich nadpisaniem lub usunięciem.

       Aplikacja  może  korzystać  z  różnych, podanych niżej, wartości wskazówek, aby podzielić zapisy na różne
       klasy zapisów, dzięki czemu wielu  użytkowników  lub  aplikacji  działających  na  stacji  z  pojedynczym
       nośnikiem  może  zbierać  swoje  wejścia/wyjścia  w  spójny  sposób. Jednak znaczniki te nie udostępniają
       żadnego funkcjonalnego zachowania, a różne klasy wejścia/wyjścia mogą używać wskazówek o  czasie  trwania
       zapisu w arbitralny sposób dopóki tylko wskazówki są stosowane konsekwentnie.

       Do deskryptora fd można zastosować następujące operacje:

       F_GET_RW_HINT (uint64_t *; od Linuksa 4.13)
              Zwraca wartość wskazówki odczytu/zapisu powiązanej z i-węzłem, do którego odnosi się fd.

       F_SET_RW_HINT (uint64_t *; od Linuksa 4.13)
              Ustawia  wartość  wskazówki  odczytu/zapisu  powiązanej  z  i-węzłem,  do  którego  odnosi się fd.
              Wskazówka ta będzie istniała do  momentu  jej  jawnej  modyfikacji  lub  do  momentu  odmontowania
              przedmiotowego systemu plików.

       F_GET_FILE_RW_HINT (uint64_t *; od Linuksa 4.13)
              Zwraca  wartość  wskazówki  odczytu/zapisu  powiązanej  z opisem otwartego pliku (OFD), do którego
              odnosi się fd.

       F_SET_FILE_RW_HINT (uint64_t *; od Linuksa 4.13)
              Ustawia wartość wskazówki odczytu/zapisu powiązanej z opisem otwartego  pliku  (OFD),  do  którego
              odnosi się fd.

       Jeśli  opisowi  otwartego  pliku  nie  przypisano  wskazówki  odczytu/zapisu,  powinien  on użyć wartości
       przypisanej i-węzłowi, jeśli taka istnieje.

       Od Linuksa 4.13 prawidłowe są następujące wskazówki odczytu/zapisu:

       RWH_WRITE_LIFE_NOT_SET
              Nie ustawiono żadnej wskazówki. Jest to wartość domyślna.

       RWH_WRITE_LIFE_NONE
              Nie ustawiono wskazówki zapisu z danym plikiem lub i-węzłem.

       RWH_WRITE_LIFE_SHORT
              Oczekuje się, że dane zapisane do tego i-węzła lub za pomocą  tego  opisu  otwartego  pliku,  będą
              istniały krótko.

       RWH_WRITE_LIFE_MEDIUM
              Oczekuje  się,  że  dane  zapisane  do tego i-węzła lub za pomocą tego opisu otwartego pliku, będą
              istniały dłużej, niż dane zapisane ze wskazówką RWH_WRITE_LIFE_SHORT.

       RWH_WRITE_LIFE_LONG
              Oczekuje się, że dane zapisane do tego i-węzła lub za pomocą  tego  opisu  otwartego  pliku,  będą
              istniały dłużej, niż dane zapisane ze wskazówką RWH_WRITE_LIFE_MEDIUM.

       RWH_WRITE_LIFE_EXTREME
              Oczekuje  się,  że  dane  zapisane  do tego i-węzła lub za pomocą tego opisu otwartego pliku, będą
              istniały dłużej, niż dane zapisane ze wskazówką RWH_WRITE_LIFE_LONG.

       Wszystkie wskazówki dotyczące zapisu są jedynie relatywne względem siebie i  nie  należy  przypisywać  im
       bezwzględnego znaczenia.

WARTOŚĆ ZWRACANA

       Wartość zwracana po pomyślnym zakończeniu funkcji zależy od operacji:

       F_DUPFD
              Nowy deskryptor pliku.

       F_GETFD
              Wartość znaczników deskryptora pliku.

       F_GETFL
              Wartość znaczników stanu pliku

       F_GETLEASE
              Typ dzierżawy ustanowionej na deskryptorze pliku.

       F_GETOWN
              Wartość właściciela deskryptora pliku.

       F_GETSIG
              Wartość  sygnału  wysłanego,  gdy  odczyt  lub zapis staną się możliwe, lub zero, dla tradycyjnego
              zachowania SIGIO.

       F_GETPIPE_SZ
       F_SETPIPE_SZ
              Pojemność potoku.

       F_GET_SEALS
              Mapa bitowa identyfikująca pieczęcie, które ustawiono dla i-węzła, do którego odnosi się fd.

       Wszystkie pozostałe operacje
              Zero.

       W razie wystąpienia błędu zwracane jest -1 i ustawiane errno wskazując błąd.

BŁĘDY

       EACCES lub EAGAIN
              Operacja uniemożliwiona przez blokady utrzymywane przez inne procesy.

       EAGAIN Operacja jest zabroniona, gdyż plik został odwzorowany w pamięci przez inny proces.

       EBADF  fd nie jest deskryptorem otwartego pliku.

       EBADF  op wynosi F_SETLK lub F_SETLKW a tryb otwarcia deskryptora pliku nie odpowiada  rodzajowi  żądanej
              blokady.

       EBUSY  op  wynosi  F_SETPIPE_SZ,  a  nowa  pojemność potoku określona w arg jest mniejsza, niż przestrzeń
              bufora aktualnie zajęta do przechowywania danych w potoku.

       EBUSY  op wynosi F_ADD_SEALS, arg zawiera  F_SEAL_WRITE  i  istnieje  zapisywalne,  dzielone  przypisanie
              pliku, do którego odnosi się fd.

       EDEADLK
              Stwierdzono, że podana operacja F_SETLKW spowodowałoby zakleszczenie blokad.

       EFAULT lock znajduje się poza dostępną dla użytkownika przestrzenią adresową.

       EINTR  op wynosi F_SETLKW lub F_OFD_SETLKW i operacja została przerwana sygnałem; zob. signal(7).

       EINTR  op  wynosi  F_GETLK,  F_SETLK,  F_OFD_GETLK  lub  F_OFD_SETLK,  a operacja została przerwana przez
              sygnał,  zanim  blokada  została  sprawdzona  lub  ustawiona.  Najbardziej  prawdopodobne  podczas
              blokowania zdalnego pliku (np. blokowanie przez NFS), ale czasami zdarza się lokalnie.

       EINVAL Wartość podana w op nie jest rozpoznawana przez to jądro.

       EINVAL op wynosi F_ADD_SEALS, a arg obejmuje nierozpoznany bit pieczęci.

       EINVAL op  wynosi F_ADD_SEALS lub F_GET_SEALS, a system plików zawierający i-węzeł, do którego odnosi się
              fd, nie obsługuje pieczętowania.

       EINVAL op wynosi F_DUPFD, a arg jest ujemny  lub  większy  od  maksymalnej  dozwolonej  wartości  (więcej
              informacji w opisie RLIMIT_NOFILE w podręczniku getrlimit(2)).

       EINVAL op wynosi F_SETSIG, a arg nie jest dozwolonym numerem sygnału.

       EINVAL op wynosi F_OFD_SETLK, F_OFD_SETLKW lub F_OFD_GETLK, a l_pid nie podano jako zero.

       EMFILE op wynosi F_DUPFD, a osiągnięto już maksymalną liczbę otwartych deskryptorów plików na proces.

       ENOLCK Zbyt  wiele  otwartych  blokad  segmentowych,  tablica  blokad  jest  pełna  lub  zawiódł protokół
              blokowania zdalnego (np. dla blokad przez NFS).

       ENOTDIR
              W op podano F_NOTIFY, lecz fd nie odnosi się do katalogu.

       EPERM  op wynosi F_SETPIPE_SZ i osiągnięto miękki lub sztywny limit potoku; zob. pipe(7).

       EPERM  Próbowano wyzerować znacznik O_APPEND na pliku posiadającym ustawiony atrybut „append-only”.

       EPERM  op wynosiło F_ADD_SEALS, lecz fd nie był otwarty  do  zapisu  albo  bieżący  zestaw  pieczęci  już
              obejmuje F_SEAL_SEAL.

STANDARDY

       POSIX.1-2008.

       F_GETOWN_EX,   F_SETOWN_EX,  F_SETPIPE_SZ,  F_GETPIPE_SZ,  F_GETSIG,  F_SETSIG,  F_NOTIFY,  F_GETLEASE  i
       F_SETLEASE są typowo linuksowe (należy zdefiniować makro _GNU_SOURCE aby pozyskać te definicje).

       F_OFD_SETLK, F_OFD_SETLKW i F_OFD_GETLK są typowo linuksowe (i konieczne jest  zdefiniowanie  _GNU_SOURCE
       do pozyskania ich definicji), lecz trwają prace nad włączeniem ich do następnej wersji POSIX.1.

       F_ADD_SEALS i F_GET_SEALS są typowo linuksowe.

HISTORIA

       SVr4, 4.3BSD, POSIX.1-2001.

       Jedynie  operacje F_DUPFD, F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_GETLK, F_SETLK i F_SETLKW są określone w
       POSIX.1-2001.

       F_GETOWN i F_SETOWN są określone w POSIX.1-2001 (do pozyskania ich definicji konieczne jest zdefiniowanie
       _XOPEN_SOURCE z wartością 500 lub większą albo _POSIX_C_SOURCE z wartością 200809L lub większą).

       F_DUPFD_CLOEXEC  jest określone w POSIX.1-2008 (do pozyskania jego definicji konieczne jest zdefiniowanie
       _POSIX_C_SOURCE z wartością 200809L lub większą albo _XOPEN_SOURCE z wartością 700 lub większą).

UWAGI

       Błędy zwracane przez dup2(2) są inne niż zwracane przez F_DUPFD.

   Blokowanie plików
       Pierwotne linuksowe wywołanie systemowego fcntl() nie było zaprojektowane do  obsługi  dużych  przesunięć
       plików  (w  strukturze  flock).  W  konsekwencji,  Linux  2.4 dodał wywołanie systemowe fcntl64(). Nowsze
       wywołanie systemowe korzysta z odmiennej  struktury  do  blokowania  plików,  flock64  i  odpowiadających
       operacji,  F_GETLK64,  F_SETLK64  i  F_SETLKW64.  Detale  te  mogą być jednak zignorowane przez aplikacje
       używające glibc, ponieważ jej funkcja opakowująca fcntl() obsługuje nowsze wywołanie systemowe, gdy tylko
       jest dostępne, w sposób przezroczysty.

   Blokady rekordów
       Od Linuksa 2.0, nie ma oddziaływania pomiędzy typami blokad zakładanych przez flock(2) i przez fcntl().

       W  niektórych  systemach  struktura  struct  flock  zawiera  dodatkowe  pola,  takie  jak np. l_sysid (do
       identyfikacji komputera, na którym utrzymywana jest blokada). Oczywiście, samo l_pid jest mało przydatne,
       gdy  proces utrzymujący blokadę może działać na innym komputerze; w Linuksie, choć pole to jest obecne na
       niektórych architekturach (np. MIPS32), to jednak nie jest używane.

       Pierwotne linuksowe wywołanie systemowego fcntl() nie było zaprojektowane do  obsługi  dużych  przesunięć
       plików  (w  strukturze  flock).  W  konsekwencji,  Linux  2.4 dodał wywołanie systemowe fcntl64(). Nowsze
       wywołanie systemowe korzysta z odmiennej  struktury  do  blokowania  plików,  flock64  i  odpowiadających
       operacji,  F_GETLK64,  F_SETLK64  i  F_SETLKW64.  Detale  te  mogą być jednak zignorowane przez aplikacje
       używające glibc, ponieważ jej funkcja opakowująca fcntl() obsługuje nowsze wywołanie systemowe, gdy tylko
       jest dostępne, w sposób przezroczysty.

   Blokowanie rekordów i NFS
       Przed Linuksem 3.12, jeśli klient NFSv4 utraci kontakt z serwerem na pewien czas (zdefiniowany jako ponad
       90 sekund bez żadnej komunikacji), to może utracić i odzyskać blokadę bez uświadamiania sobie tego  faktu
       (czas,  po  którym  przyjmuje  się utratę połączenia jest znany jako czas dzierżawy NFSv4 (leasetime); na
       serwerze NFS można go sprawdzić w  pliku  /proc/fs/nfsd/nfsv4leasetime,  który  podaje  go  w  sekundach;
       domyślną  wartością w pliku jest 90). Ten scenariusz grozi uszkodzeniem danych, ponieważ inny proces mógł
       w międzyczasie posiąść blokadę i dokonać operacji wejścia/wyjścia na pliku.

       Od Linuksa 3.12, jeśli klient NFSv4 utraci połączenie  z  serwerem,  każda  operacja  wejścia/wyjścia  na
       pliku,  przez  proces  który „sądzi”, że utrzymuje blokadę zawiedzie, dopóki ten proces nie zamknie i nie
       otworzy pliku ponownie. Można ustawić  parametr  jądra  nfs.recover_lost_locks  na  1,  aby  powrócić  do
       zachowania  sprzed  wersji 3.12, gdy klient próbuje odzyskać zagubione blokady po odzyskaniu połączenia z
       serwerem. Ze względu na towarzyszące temu ryzyko uszkodzenia danych,  domyślnie  parametr  ten  wynosi  0
       (jest wyłączony).

USTERKI

   F_SETFL
       Nie  da  się  użyć  F_SETFL  do  zmiany statusu znaczników O_DSYNC i O_SYNC. Takie próby zostaną po cichu
       zignorowane.

   F_GETOWN
       Ograniczenie konwencji linuksowego wywołania systemowego na niektórych architekturach  (przede  wszystkim
       i386)  oznacza, że jeśli (ujemny) identyfikator grupy procesu mający być zwrócony przez F_GETOWN znajduje
       się w przedziale od -1 do -4095, to zwracana wartość jest przez glibc nieprawidłowo  interpretowana  jako
       błąd  w  wywołaniu  systemowym; to jest zwrócona przez fcntl() wartość będzie wynosiła -1, a errno będzie
       zawierać (dodatni)  identyfikator  grupy  procesu.  Typowo  linuksowa  operacja  F_GETOWN_EX  unika  tego
       problemu.  Od  glibc  2.11,  glibc  czyni  problem  jądra F_GETOWN niewidzialnym, przez zaimplementowanie
       F_GETOWN za pomocą F_GETOWN_EX.

   F_SETOWN
       W Linuksie 2.4 i wcześniejszych istnieje błąd, który może  się  ujawnić,  gdy  proces  nieuprzywilejowany
       używa  F_SETOWN  do  podania  właściciela  deskryptora  pliku  gniazda,  będące procesem (grupą) inną niż
       wywołujący. W tym przypadku fcntl() może zwrócić -1 z  errno  ustawionym  na  EPERM  nawet  wówczas,  gdy
       właściciel  procesu  (grupy) był tym, do którego wywołujący ma prawo wysyłania sygnałów. Pomimo zwracania
       błędu, własność deskryptora pliku jest ustawiana, a sygnały będą wysyłane do właściciela.

   Wykrywanie zakleszczeń
       Algorytm wykrywania zakleszczeń używany przez jądro przy  przetwarzaniu  żądań  F_SETLKW  może  skutkować
       wykryciami  zarówno  fałszywie negatywnymi (niewykryciem zakleszczeń, pozostawiając zestaw zakleszczonych
       procesów stale  zablokowanymi),  jak  i  fałszywie  pozytywnymi  (błąd  EDEADLK,  gdy  zakleszczenie  nie
       występuje).  Przykładowo,  jądro  ogranicza  głębokość  poszukiwania  zależności  blokad  do 10 kroków co
       oznacza, że łańcuch kolistych zakleszczeń większy od tego rozmiaru nie zostanie wykryty. Dodatkowo, jądro
       może  nieprawidłowo  wskazywać zakleszczenie, gdy dwa lub więcej procesów utworzonych za pomocą znacznika
       CLONE_FILES z clone(2), wyglądają (dla jądra) na będące w konflikcie.

   Blokowanie obowiązujące (przymusowe)
       Linuksowa implementacja blokowania obowiązującego (przymusowego) jest podatna  na  sytuację  wyścigu,  co
       czyni  ją  nierzetelną: wywołanie write(2), które nachodzi na blokadę może zmodyfikować dane po uzyskaniu
       blokady, wywołanie read(2) które nachodzi na blokadę może  wykryć  zmianę  danych,  dokonaną  jedynie  po
       uzyskaniu  blokady  zapisu.  Podobny  wyścig istnieje pomiędzy blokadami obowiązującymi a mmap(2). Z tego
       powodu nie należy polegać na blokowaniu obowiązującym.

ZOBACZ TAKŻE

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

       locks.txt, mandatory-locking.txt i dnotify.txt w katalogu Documentation/filesystems/ źródeł  jądra  Linux
       (w   starszych   jądrach   pliki   te  znajdują  się  bezpośrednio  w  katalogu  Documentation/,  a  plik
       mandatory-locking.txt ma nazwę mandatory.txt)

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika  są:  Przemek  Borys  <pborys@dione.ids.pl>,
       Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją.  Bliższe informacje o warunkach licencji można uzyskać
       zapoznając się z GNU General Public License w wersji  3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  lub
       nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

       Błędy  w  tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy dyskusyjnej ⟨manpages-pl-
       list@lists.sourceforge.net⟩.