Provided by: manpages-pl_4.23.1-1_all bug

NAZWA

       attributes - pojęcia bezpieczeństwa POSIX

OPIS

       Uwaga:  tekst  niniejszej  strony  podręcznika  systemowego powstał w oparciu o materiał z
       rozdziału „POSIX Safety Concepts” podręcznika biblioteki GNU C. Więcej szczegółów na temat
       poniższych tematów można znaleźć tamże.

       Różne  strony podręcznika systemowego zawierają rozdział ATRYBUTY opisujący bezpieczeństwa
       wywoływania  funkcji  w  różnych  sytuacjach.  Niniejszy  rozdział   opisuje   funkcje   z
       następującymi oznaczeniami bezpieczeństwa:

       MT-bezpieczne
              Funkcje  MT-bezpieczne,  MT-Safe lub wątkowo-bezpieczne można bezpiecznie wywołać w
              obecności innych wątków. Cząstka MT w nazwie  oznacza  wielowątkowość  (ang.  Multi
              Thread).

              Bycie MT-bezpieczną nie oznacza, że funkcja jest niepodzielna, ani że używa jakichś
              mechanizmów  synchronizacji  pamięci,  udostępnianych  przez  POSIX   użytkownikom.
              Możliwe jest nawet, że wywołania kolejnych funkcji MT-bezpiecznych nie da w efekcie
              kombinacji  MT-bezpiecznej.  Przykładowo,  jeśli  istnieje  wątek  wywołujący  dwie
              funkcje  MT-bezpieczne  jedna po drugiej, nie gwarantuje to zachowania równoważnego
              niepodzielnemu wykonaniu kombinacji obu funkcji, ponieważ współbieżne  wywołania  w
              różnych wątkach mogą ze sobą oddziaływać w destrukcyjny sposób.

              Optymalizacje  całych  programów,  które  mogą doprowadzić do wyodrębnienia funkcji
              jako podprogramu (funkcji otwartej) na  przestrzeni  interfejsów  biblioteki,  mogą
              doprowadzić do niebezpiecznej zmiany kolejności, dlatego nie zaleca się dokonywania
              takiego wyodrębniania na przestrzeni interfejsu biblioteki  GNU  C.  Udokumentowany
              status  MT-bezpieczny  nie  jest  gwarantowany przy optymalizacji całych programów.
              Jednak  funkcje  zdefiniowane  w  widocznych   dla   użytkownika   nagłówkach,   są
              zaprojektowane jako bezpieczne do wyodrębniania.

       MT-niebezpieczne
              Funkcje  MT-niebezpieczne lub MT-Unsafe nie są bezpieczne do wywołania w programach
              wielowątkowych.

       Inne słowa kluczowe pojawiające się w uwagach nt. bezpieczeństwa zdefiniowano w  kolejnych
       rozdziałach.

   Funkcjonalności warunkowo bezpieczne
       Dla  niektórych  funkcjonalności czyniących funkcje niebezpiecznymi do wywołania w pewnych
       sytuacjach,  znane  są  sposoby  ominięcia  kłopotów  z  bezpieczeństwem,  nie  wymagające
       całkowitej  rezygnacji  z  ich  wywoływania. Poniższe słowa kluczowe odnoszą się do takich
       funkcjonalności i każda z definicji wskazuje, jak  należy  ograniczyć  cały  program,  aby
       uniknąć   problemu  z  bezpieczeństwem  wskazanych  danym  słowem  kluczowym.  Jedynie  po
       zaobserwowaniu i odniesieniu się do powodów, które czynią funkcję niebezpieczną, za pomocą
       nałożenia  udokumentowanych  ograniczeń, funkcja staje się bezpieczna do wywołania w danym
       kontekście.

       init   Funkcje oznaczone  jako  init  w  kontekście  problemów  bezpieczeństwa  wątkowego,
              przeprowadzają przy pierwszym wywołaniu inicjalizację, która jest MT-niebezpieczna.

              Wywołanie  takiej  funkcji  przynajmniej raz w trybie pojedynczego wątku, usuwa ten
              konkretny powód do uznania tej funkcji jako MT-niebezpiecznej. Jeśli nie  występują
              inne powody, to funkcję można bezpiecznie wywoływać po uruchomieniu innych wątków.

       race   Funkcje oznaczone jak race w kontekście problemów bezpieczeństwa wątkowego działają
              na obiektach w sposób, który  może  powodować  wyścig  do  danych  lub  inne  formy
              destrukcyjnej  interferencji  przy współbieżnym wykonaniu. W niektórych przypadkach
              te obiekty są przekazywane do funkcji przez użytkowników; w innych są  one  używane
              przez  funkcje  do  zwrócenia  wartości użytkownikom; w jeszcze innych nie są nawet
              ujawniane użytkownikom.

       const  Funkcje oznaczone jako  const  w  kontekście  problemów  bezpieczeństwa  wątkowego,
              modyfikują  w sposób nieatomowy obiekty wewnętrzne, które mogą być raczej rozważane
              jako  stałe,  ponieważ  znaczna  część  biblioteki  GNU  C  korzysta  z  nich   bez
              synchronizacji.   W   przeciwieństwie   do   race,   które   powoduje   uznanie  za
              MT-niebezpieczną zarówno odczytujących jak i zapisujących  obiekty  wewnętrzne,  to
              oznaczenie   odnosi   się   wyłącznie   do   zapisujących.   Zapisujący   pozostają
              MT-niebezpieczni przy wywołaniu, lecz obowiązkowa później stałość  obiektów,  które
              modyfikują, umożliwia uznanie odczytujących za MT-bezpiecznych (o ile nie pozostają
              inne powody do uznania ich za niebezpiecznych), ponieważ  brak  synchronizacji  nie
              jest problemem, gdy obiekty są faktycznie stałe.

              Identyfikator,  który  występuje  po  oznaczeniu  const  pojawi  się jako adnotacja
              bezpieczeństwa  przy  odczytujących.  Programy,  które  chcą  przeciwdziałać   temu
              problemowi  bezpieczeństwa,  jednak  tak  aby  móc  wywołać zapisujących, mogą użyć
              nierekurencyjnej blokady odczytu i zapisu powiązanej z  identyfikatorem  i  chronić
              wszystkie  wywołania  do  funkcji  oznaczonej  jako   const,  po  której  następuje
              identyfikator blokady zapisu oraz wszystkie wywołania do funkcji  oznaczonej  samym
              identyfikatorem za pomocą blokady odczytu.

       sig    Funkcje  oznaczone  jako  sig  w kontekście problemów bezpieczeństwa wątkowego mogą
              tymczasowo instalować procedurę obsługi sygnału do celów wewnętrznych,  która  może
              interferować z innymi użyciami sygnału, wymienionymi po dwukropku.

              Temu  problemowi  bezpieczeństwa można przeciwdziałać, upewniając się, że w trakcie
              wywołania nie  dojdzie  do  innego  użycia  sygnału.  Zalecane  jest:  utrzymywanie
              nierekurencyjnej   blokady   mutex  (wzajemnego  wykluczania)  podczas  wywoływania
              wszystkich funkcji używających tego samego sygnału  tymczasowego;  blokowanie  tego
              sygnału przed wywołaniem i późniejsze resetowanie jego procedury obsługi.

       term   Funkcje  oznaczone  jako  term w kontekście problemów bezpieczeństwa wątkowego mogą
              zmieniać ustawienia terminala w zalecany sposób, głównie:  wywoływać  tcgetattr(3),
              modyfikować niektóre znaczniki (flagi) i później wywoływać tcsetattr(3), co otwiera
              okno, w którym zmiany wykonane przez inne wątki są tracone. Z tego względu  funkcje
              oznaczone jako term są MT-niebezpieczne.

              Zaleca   się   dlatego   aplikacjom  używającym  terminala  unikać  równoczesnej  i
              wielobieżnej interakcji z terminalem, nie  używając  mogących  się  tak  zachowywać
              procedur  obsługi  sygnału  lub  sygnałów  blokujących  i  utrzymywać  blokadę przy
              ponownym wywoływaniu tych funkcji i interakcji z terminalem.  Blokady  tej  powinno
              się  używać  również do wzajemnego wykluczania w przypadku funkcji oznaczonych jako
              race:tcattr(fd),  gdzie  fd  jest  deskryptorem  pliku  kontrolującego   terminala.
              Wywołujący   może   użyć   następujących  blokad  wzajemnego  wykluczania  (mutex):
              pojedynczej (dla ułatwienia) albo po jednej na terminal, nawet gdy są  one  opisane
              różnymi deskryptorami pliku.

   Dodatkowe uwagi dotyczące bezpieczeństwa
       Do  funkcji  mogą być dołączone dodatkowe słowa kluczowe wskazujące funkcjonalności, które
       co prawda nie czynią funkcji niebezpiecznej do wywołania, ale powinny być wzięte pod uwagę
       w określonych klasach programów:

       locale Funkcje   z  adnotacją  locale  w  kontekście  problemów  bezpieczeństwa  wątkowego
              odczytują z obiektu locale (tłumaczenia) bez  jakiejkolwiek  formy  synchronizacji.
              Funkcje  z  adnotacją locale wywoływane równolegle ze zmianą locale mogą zachowywać
              się w sposób nieodnoszący się do żadnych z aktywnych locale podczas ich  wykonania,
              lecz z nieprzewidywalną ich mieszanką.

              Funkcje  te  nie są jednak oznaczane jako MT-niebezpieczne. To funkcje modyfikujące
              obiekt locale są oznaczane uwagą const:locale i są uważane za niebezpieczne. Z tego
              powodu,  funkcje  modyfikujące  nie powinny być wywoływane, gdy działa kilka wątków
              lub włączone  są  sygnały  asynchroniczne.  W  tych  kontekstach  locale  mogą  być
              rozważane  jako  efektywnie  stałe,  co czyni omawiane w powyższym akapicie funkcje
              bezpiecznymi.

       env    Funkcje oznaczone jako env w kontekście problemów bezpieczeństwa wątkowego uzyskują
              dostęp  do  środowiska  za  pomocą  getenv(3)  lub  podobnego,  bez  żadnej ochrony
              zapewniającej bezpieczeństwo w obecności równoległych modyfikacji.

              Funkcje te nie są jednak oznaczane jako MT-niebezpieczne. To  funkcje  modyfikujące
              środowisko  są  oznaczane  uwagą  const:env  i  są uważane za niebezpieczne. Z tego
              powodu, funkcje modyfikujące nie powinny być wywoływane, gdy  działa  kilka  wątków
              lub  włączone  są  sygnały  asynchroniczne.  W tych kontekstach środowisko może być
              rozważane jako efektywnie stałe, co czyni omawiane  w  powyższym  akapicie  funkcje
              bezpiecznymi.

       hostid Funkcje  oznaczone  jako  hostid  w  kontekście  problemów bezpieczeństwa wątkowego
              odczytują z systemowych  struktur  danych  identyfikator  stacji  („host  id”).  Te
              struktury danych zwykle nie mogą być modyfikowane w sposób niepodzielny. Ze względu
              na  założenie,  że  identyfikator  stacji  nie  powinien  się   zmieniać,   funkcje
              odczytujące  go  (gethostid(3))  są  uważane  za  bezpieczne,  natomiast funkcje go
              modyfikujące (sethostid(3))  są  oznaczane  jako  const:hostid  wskazując,  że  ich
              wywołanie  może  wymagać  szczególnej uwagi. W tym konkretnym przypadku, szczególna
              uwagę  należy  zwrócić  na  koordynację  na  poziomie  systemu   (a   nie   jedynie
              wewnątrzprocesową).

       sigintr
              Funkcje  oznaczone  jako  sigintr  w  kontekście problemów bezpieczeństwa wątkowego
              uzyskują dostęp do wewnętrznej struktury danych  _sigintr  biblioteki  GNU  C,  bez
              żadnej ochrony zapewniającej bezpieczeństwo w momencie równoległej modyfikacji.

              Funkcje  te  nie są jednak oznaczane jako MT-niebezpieczne. To funkcje modyfikujące
              struktury danych są oznaczane uwagą const:sigintr i są uważane za niebezpieczne.  Z
              tego  powodu,  funkcje  modyfikujące  nie  powinny być wywoływane, gdy działa kilka
              wątków lub włączone są sygnały asynchroniczne. W tych kontekstach struktury  danych
              mogą  być  rozważane  jako efektywnie stałe, co czyni omawiane w powyższym akapicie
              funkcje bezpiecznymi.

       cwd    Funkcje oznaczone jako cwd  w kontekście problemów  bezpieczeństwa  wątkowego  mogą
              tymczasowo  zmieniać  bieżący katalog roboczy podczas wykonania, co może spowodować
              ustalanie ścieżek względnych w sposób nieoczekiwany  dla  innych  wątków  lub  przy
              procedurach obsługi odwoływania lub asynchronicznych sygnałach.

              Nie  jest  to  wystarczający  powód  do  oznaczania  funkcji  z taką adnotacją jako
              MT-niebezpiecznej,  lecz  gdy  zachowanie  to  jest  opcjonalne  (np.   nftw(3)   z
              FTW_CHDIR),  unikanie  takiej  opcji może być dobrą alternatywą do używania pełnych
              ścieżek  lub  wywołań  systemowych  odnoszących  się  do  deskryptorów  pliku  (np.
              openat(2)).

       :identyfikator
              Po  adnotacjach  może  czasem  wystąpić identyfikator, który ma pogrupować funkcje,
              które np. uzyskują  dostęp  do  struktur  danych  w  niebezpieczny  sposób,  jak  w
              przypadku  race  i  const  lub  udostępniać szczegółowe informacje, takie jak nazwa
              sygnału w funkcji oznaczonej jako sig. Przewiduje się, że  może  to  w  przyszłości
              dotyczyć również lock i corrupt.

              W  większości  przypadku  identyfikator  wymieni  zestaw  funkcji, ale czasami może
              nazwać obiekty globalne, argumenty funkcji lub  powiązane  z  nimi  identyfikowalne
              właściwości lub fragmenty logiczne. Stosowania notacja to np. :buf(arg) aby wskazać
              bufor powiązany z argumentem arg lub :tcattr(fd)  aby  wskazać  atrybuty  terminala
              deskryptora pliku fd.

              Najczęstszym   zastosowanie  identyfikatorów  jest  udostępnienie  logicznych  grup
              funkcji  i  argumentów,  które  muszą  być  chronione  przez  te  same   mechanizmy
              synchronizacji, aby zapewnić bezpieczne operowanie w danym kontekście.

       /warunek
              Część uwag bezpieczeństwa może być warunkowa co oznacza, że mają zastosowanie tylko
              gdy prawdziwe jest wyrażenie warunkowe dotyczące argumentów,  zmiennych  globalnych
              albo   nawet  wartości  jądra.  Na  przykład  /!ps  i  /one_per_line  wskazują,  że
              wcześniejsza uwaga ma zastosowanie tylko, gdy argumentem ps jest NULL, albo zmienna
              globalna one_per_line jest niezerowa.

              Jeśli  wszystkie uwagi czyniące funkcję niebezpieczną są opatrzone takimi warunkami
              i żaden z wskazanych warunków nie jest spełniony, to funkcja może  być  uważana  za
              bezpieczną.

ZOBACZ TAKŻE

       pthreads(7), signal-safety(7)

TŁUMACZENIE

       Autorami   polskiego   tłumaczenia   niniejszej   strony  podręcznika  są:  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⟩.