Provided by: manpages-pl_0.6-2_all bug

NAZWA

       unix - gniazda lokalnej komunikacji międzyprocesowej

SKŁADNIA

       #include <sys/socket.h>
       #include <sys/un.h>

       unix_socket = socket(AF_UNIX, type, 0);
       error = socketpair(AF_UNIX, type, 0, int *sv);

OPIS

       Rodzina  gniazd AF_UNIX (znana również jako AF_LOCAL) służy do wydajnej komunikacji pomiędzy procesami na
       tej samej maszynie. Zgodnie z tradycją, gniazda domeny uniksowej mogą być albo anonimowe (tworzone  przez
       socketpair(2)),  albo  skojarzone  z  plikiem typu gniazda. Linux wspiera również abstrakcyjną przestrzeń
       nazw, niezależną od systemu plików.

       Poprawne typy to: SOCK_STREAM dla gniazd strumieniowych,  SOCK_DGRAM  dla   gniazd  datagramowych,  które
       zachowują  granice  komunikatów  (w  przypadku większości implementacji Uniksa gniazda uniksowe są zawsze
       niezawodne i nie zmieniają kolejności datagramów), oraz (od  wersji  Linuksa  2.6.4)  SOCK_SEQPACKET  dla
       gniazd  zorientowanych  połączeniowo,  które  zachowują  granice  komunikatu  i  dostarczają komunikaty w
       kolejności ich wysyłania.

       Za pośrednictwem pomocniczych danych można przez gniazda domeny uniksowej przekazywać do innych  procesów
       deskryptory plików i uwierzytelnienia procesów.

   Format adresu
       Adres gniazda domeny uniksowej jest reprezentowany przez następującą strukturę:

           #define UNIX_PATH_MAX    108

           struct sockaddr_un {
               sa_family_t sun_family;               /* AF_UNIX */
               char        sun_path[UNIX_PATH_MAX];  /* ścieżka dostępu */
           };

       sun_family zawsze zawiera AF_UNIX.

       W strukturze rozróżniane są trzy typy adresów:

       *  pathname:  gniazdo  domeny  uniksowej  może  zostać  związane  z zakończoną znakiem NULL nazwą ścieżki
          systemowej za pomocą bind(2). Jeśli adres gniazda jest zwracany przez getsockname(2), getpeername(2) i
          accept(2), to jego długością jest

              offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1

          a sun_path zawiera nazwę ścieżki zakończoną znakiem NULL.

       *  unnamed: Gniazdo strumieniowe nie związane z  nazwą  ścieżki  za  pomocą  bind(2)  nie  jest  nazwane.
          Podobnie  dwa  gniazda  utworzone przez socketpair(2) nie są nazwane. Jeśli adres nienazwanego gniazda
          jest  zwracany  przez  getsockname(2),  getpeername(2)   i   accept(2),   to   jego   długością   jest
          sizeof(sa_family_t), a zawartość sun_path nie powinna być sprawdzana.

       *  abstract:  adres  gniazda  abstrakcyjnego  jest  rozróżniany  po  tym, że sun_path[0] jest bajtem NULL
          ("\0"). Adres gniazda znajduje się w przestrzeni nazw podanej w dodatkowych bajtach w sun_path,  które
          są  pokryte  przez  długość  struktury  adresu  (Bajty  NULL  w  nazwie  nie  mają żadnego specjalnego
          znaczenia). Nazwa  nie  ma  żadnego  powiązania  z  nazwą  pliku  w  systemie  plików.  Adres  gniazda
          abstrakcyjnego  zwracany  przez  getsockname(2),  getpeername(2)  oraz  accept(2)  ma  w  polu addrlen
          ustawioną długość większą niż sizeof(sa_family_t) (tj. większą niż 2), a nazwa gniazda zawarta jest  w
          pierwszych   (addrlen   -   sizeof(sa_family_t))   bajtach   pola  sun_path.  Przestrzeń  nazw  gniazd
          abstrakcyjnych jest nieprzenaszalnym rozszerzeniem Linuksa.

   Opcje gniazda
       Ze względów historycznych następujące opcje gniazd są podawane przy typie SOL_SOCKET, pomimo  że  są  one
       specyficzne  dla  AF_UNIX.  Można je ustawić za pomocą setsockopt(2), a odczytać za pomocą getsockopt(2),
       podając SOL_SOCKET jako rodzinę gniazd.

       SO_PASSCRED
              Włącza otrzymywanie uwierzytelnień od procesu wysyłającego komunikat  pomocniczy.  Przy  włączonej
              tej  opcji  i niepołączonym jeszcze gnieździe, unikatowa nazwa gniazda z abstrakcyjnej przestrzeni
              nazw jest generowana automatycznie. Oczekiwany jest logiczny znacznik typu całkowitego.

   Automatyczne przypisywanie adresów
       Jeśli w wywołaniu bind(2) podane zostanie addrlen równe sizeof(sa_family_t) lub opcja SO_PASSCRED gniazda
       była ustawiona dla gniazda nieprzypisanego do adresu, wtedy gniazdo jest  automatycznie  przypisywane  do
       adresu  abstrakcyjnego.  Adres ten składa się z bajtu NULL, po którym następuje 5 bajtów ze zbioru znaków
       [0-9a-f]. W związku z tym liczba automatycznie przypisywanych adresów jest  ograniczona  przez  2^20.  (W
       Linuksie  2.1.15,  w którym dodano możliwość automatycznego przypisywania adresów, i w kolejnych wersjach
       używane było 8 bajtów, a limit wynosił 2^32 adresów. Zostało to zmienione na 5 bajtów w Linuksie 2.3.15).

   API gniazd
       W kolejnych paragrafach opisano pewne szczegóły implementacji API  gniazd  domeny  UNIX  specyficzne  dla
       Linuksa oraz cechy niewspierane.

       Gniazda  z  domeny  uniksowej  nie obsługują zawiadomienia o danych autonomicznych (flaga MSG_OOB funkcji
       send(2) i recv(2)).

       Flaga MSG_MORE funkcji send(2) nie jest obsługiwana dla gniazd domeny uniksowej.

       Użycie MSG_TRUNC w argumencie flags funkcji recv(2) nie jest obsługiwane dla gniazd domeny uniksowej.

       Opcja SO_SNDBUF działa w przypadku gniazd domeny uniksowej, ale  opcja  SO_RCVBUF  już  nie.  Dla  gniazd
       datagramowych  wartość  SO_SNDBUF  nakłada górny limit na rozmiar wychodzących datagramów. Limit ten jest
       liczony jako podwojona (patrz socket(7)) wartość opcji minus 32 bajty wymagane na informacje  nie  będące
       danymi.

   Komunikaty pomocnicze
       Dane  pomocnicze  są  wysyłane  i  odbierane za pomocą sendmsg(2) i recvmsg(2). Ze względów historycznych
       komunikaty pomocnicze poniższych typów są podawane przy typie SOL_SOCKET, pomimo że  są  one  specyficzne
       dla  AF_UNIX.  Aby  je  wysłać,  należy  ustawić  pole cmsg_level struktury cmsghdr na SOL_SOCKET, a pole
       cmsg_type na typ. Więcej informacji można znaleźć w cmsg(3).

       SCM_RIGHTS
              Odbieranie od innego procesu lub wysyłanie do niego zbioru otwartych deskryptorów  plików.  Porcja
              danych  zawiera  tablicę  liczb  całkowitych będących deskryptorami plików. Przekazane deskryptory
              plików zachowują się tak, jakby zostały utworzone za pomocą dup(2).

       SCM_CREDENTIALS
              Odbieranie lub wysyłanie uwierzytelnień uniksowych. Może służyć do  autoryzacji.  Uwierzytelnienia
              są  przekazywane  jako  komunikat  pomocniczy  typu  struct ucred, zdefiniowanego w <sys/socket.h>
              następująco:

                  struct ucred {
                      pid_t pid;  /* identyfikator procesu wysyłającego */
                      uid_t uid;  /* ident. użytkownika procesu wysyłającego */
                      gid_t gid;  /* ident. grupy procesu wysyłającego */
                  };

              Począwszy od wersji 2.8 biblioteki glibc, aby uzyskać dostęp  do  definicji  powyższej  struktury,
              należy zdefiniować makro _GNU_SOURCE (przed dołączeniem jakichkolwiek plików nagłówkowych).

              Jądro  sprawdza  uwierzytelnienia  podane  przez  wysyłającego. Proces o efektywnym ID użytkownika
              równym 0 może podać wartości, które  różnią  się  od  jego  własnych.  W  pozostałych  przepadkach
              wysyłający  musi  podać  swój  własny  identyfikator  procesu  (o ile nie ma ustawionego znacznika
              CAP_SYS_ADMIN), swój własny identyfikator użytkownika,  efektywny  identyfikator  użytkownika  lub
              ustawiony  identyfikator  użytkownika  (o  ile  nie ma ustawionego znacznika CAP_SETUID) oraz swój
              własny identyfikator grupy, efektywny identyfikator grupy lub ustawiony identyfikator grupy (o ile
              nie ma ustawionego znacznika CAP_SETGID). Aby otrzymać komunikat typu struct  ucred,  dla  gniazda
              musi być włączona opcja SO_PASSCRED.

   Kontrolki systemowe (ioctl)
       Następujące wywołania ioctl(2) zwracają informacje w parametrze value. Poprawna składnia to:

              int value;
              error = ioctl(unix_socket, ioctl_type, &value);

       ioctl_type może przyjmować wartość:

       SIOCINQ
              Zwraca  ilość  nieprzeczytanych  jeszcze  danych  znajdujących się w kolejce buforu odbierającego.
              Gniazdo nie może się znajdować w stanie "LISTEN"; w  przeciwnym  wypadku  zostanie  zwrócony  błąd
              (EINVAL).  SIOCINQ  jest  zdefiniowany  w  <linux/sockios.h>.  Alternatywnie  można  użyć synonimu
              FIONREAD zdefiniowanego w <sys/ioctl.h>.

BŁĘDY

       EADDRINUSE
              Podany adres lokalny jest zajęty lub obiekt gniazda w systemie plików już istnieje.

       ECONNREFUSED
              Adres zdalny podany w connect(2) nie odnosił  się  do  gniazda  nasłuchującego.  Błąd  może  także
              wystąpić jeśli nazwa docelowego pliku nie jest gniazdem.

       ECONNRESET
              Zdalne gniazdo zostało nieoczekiwanie zamknięte.

       EFAULT Nieprawidłowy adres pamięci użytkownika.

       EINVAL Podano nieprawidłowy argument. Najczęstszą przyczyną jest brak ustawionego AF_UNIX w polu sun_type
              przekazywanych gniazdu adresów lub nieprawidłowy dla danej operacji stan gniazda.

       EISCONN
              Wywołano connect(2) dla już połączonego gniazda lub podano adres docelowy dla połączonego gniazda.

       ENOENT Nie istnieje ścieżka dla zdalnego adresu przekazanego do connect(2).

       ENOMEM Brak pamięci.

       ENOTCONN
              Operacja na gnieździe wymaga adresu docelowego, a gniazdo nie jest połączone.

       EOPNOTSUPP
              Operacja  strumieniowa  wywołana  dla  gniazda  niestrumieniowego  lub  próba  użycia opcji danych
              autonomicznych.

       EPERM  Wysyłający podał nieprawidłowe uwierzytelnienia w struct ucred.

       EPIPE  Zdalne gniazdo strumieniowe zostało zamknięte. Gdy włączone,  wysyłany  jest  jednocześnie  sygnał
              SIGPIPE. Można tego uniknąć, przekazując znacznik MSG_NOSIGNAL do sendmsg(2) lub recvmsg(2).

       EPROTONOSUPPORT
              Podanym protokołem nie jest AF_UNIX.

       EPROTOTYPE
              Typ gniazda zdalnego różni się od typu gniazda lokalnego (SOCK_DGRAM wobec SOCK_STREAM)

       ESOCKTNOSUPPORT
              Nieznany typ gniazda.

       Inne  błędy  mogą  zostać  wygenerowane  przez  podstawową warstwę gniazd lub przez system plików podczas
       tworzenia obiektu gniazda w systemie plików. Więcej informacji można  znaleźć  na  odpowiednich  stronach
       podręcznika.

WERSJE

       SCM_CREDENTIALS  oraz  abstrakcyjna  przestrzeń  nazw zostały wprowadzone w Linuksie 2.2 i nie należy ich
       używać w przenośnych programach. (Niektóre systemy wywodzące się z BSD  również  wspierają  przekazywanie
       uwierzytelnień, ale implementacje różnią się szczegółami).

UWAGI

       W  linuksowej implementacji dla gniazda widocznych w systemie plików są stosowane uprawnienia katalogu, w
       którym się znajdują. Ich właściciela, grupę  oraz  prawa  dostępu  można  zmieniać.  Gdy  proces  nie  ma
       uprawnień  do  zapisu  i  przeszukiwania (uruchamiania) do katalogu, w którym tworzone jest gniazdo, jego
       utworzenie się nie powiedzie. Połączenie z obiektem gniazda wymaga praw odczytu/zapisu. Takie  zachowanie
       różni  się  od  zachowania  wielu  systemów  wywodzących się z BSD, które ignorują uprawnienia dla gniazd
       uniksowych. Programy przenośne ze względów bezpieczeństwa nie powinny polegać na tej cesze.

       W trakcie łączenia się z gniazdem mającym przypisaną nazwę pliku, tworzony jest plik specjalny gniazda  w
       systemie  plików, który musi zostać usunięty (za pomocą unlink(2)) przez wywołującego, gdy już nie będzie
       potrzebny. Stosuje się tu zwykła uniksowa składnia opóźnionego zamknięcia  (ang.  close-behind):  gniazdo
       można  skasować w dowolnym momencie, ale zostanie ono ostatecznie usunięte z systemu plików po zamknięciu
       ostatniego odwołania do niego.

       Aby przekazać deskryptory plików  lub  uwierzytelnienia  poprzez  SOCK_STREAM  trzeba  wysłać/odebrać  co
       najmniej jeden bajt niepomocniczych danych w tym samym wywołaniu sendmsg(2) lub recvmsg(2)

       Gniazda strumieniowe z domeny uniksowej nie obsługują zawiadomienia o danych autonomicznych.

PRZYKŁAD

       Patrz bind(2).

       Przykład użycia SCM_RIGHTS można znaleźć w cmsg(3).

ZOBACZ TAKŻE

       recvmsg(2), sendmsg(2), socket(2), socketpair(2), cmsg(3), capabilities(7), credentials(7), socket(7)

O STRONIE

       Angielska  wersja  tej strony pochodzi z wydania 3.71 projektu Linux man-pages. Opis projektu, informacje
       dotyczące  zgłaszania   błędów,   oraz   najnowszą   wersję   oryginału   można   znaleźć   pod   adresem
       http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

       Autorami  polskiego  tłumaczenia  niniejszej  strony  podręcznika man są: Andrzej M. Krzysztofowicz (PTM)
       <ankry@mif.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>.

       Polskie tłumaczenie jest częścią  projektu  manpages-pl;  uwagi,  pomoc,  zgłaszanie  błędów  na  stronie
       http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją  3.71 oryginału.

Linux                                              2012-05-10                                            UNIX(7)