Provided by: manpages-pl_20060617-4_all bug

NAZWA

       unix, PF_UNIX, AF_UNIX, PF_LOCAL, AF_LOCAL - gniazda lokalnej komunikacji międzyprocesowej

SKŁADNIA

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

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

OPIS

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

       Prawidłowe  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  jądra  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 poprzez gniazda uniksowe przekazywać do  innych
       procesów deskryptory plików i uwierzytelnianie procesów.

FORMAT ADRESU

       Adres  gniazda  uniksowego  jest  zdefiniowany jako nazwa pliku w systemie plików lub jako
       unikatowy  łańcuch  w  abstrakcyjnej  przestrzeni  nazw.  Gniazda  utworzone   za   pomocą
       socketpair(2)  są  anonimowe.  Dla  gniazd  nieanonimowych adres docelowy można ustawić za
       pomocą connect(2). Adres lokalny  można  ustawić  za  pomocą  bind(2).  Gdy  gniazdo  jest
       połączone,  ale  nie  posiada jeszcze adresu lokalnego, jest mu przypisywany automatycznie
       wygenerowany unikatowy adres w abstrakcyjnej przestrzeni nazw.

         #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 ma wartość AF_UNIX.  sun_path  zawiera  zakończoną  znakiem  null  nazwę
       ścieżki  dostępu  do  gniazda  w  systemie plików. Gdy sun_path zaczyna się bajtem zerowym
       (” '), odnosi się do abstrakcyjnej przestrzeni nazw, którą zarządza moduł protokołu  Unix.
       Adres  gniazda  w tej przestrzeni nazw stanowią pozostałe bajty sun_path. Należy zauważyć,
       że nazwy w abstrakcyjnej przestrzeni nazw nie są zakończone znakiem null.

OPCJE GNIAZD

       Ze względów historycznych następujące opcje gniazd  są  podawane  przy  typie  SOL_SOCKET,
       pomimo  że  są  one  specyficzne  dla PF_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  nie  połączonym  jeszcze gnieździe, unikatowa nazwa
              gniazda z abstrakcyjnej przestrzeni nazw jest generowana automatycznie.  Oczekiwany
              jest logiczny znacznik typu całkowitego.

CECHY (NIE)WSPIERANE

       W  olejnych  paragrafach  opisano  pewnie  szczegóły  implementacji API gniazd domeny Unix
       specyficzne dla Linuksa oraz cechy niewspierane.

       Gniazda  strumieniowe  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 Unix.

       Opcje  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 PF_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.

                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 */
                };

              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.

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ę w szczegółach.)

UWAGI

       W linuksowej implementacji, gniazda widoczne w systemie plików stosują  się  do  uprawnień
       katalogu, w którym się znajdują. Ich właściciela, grupę oraz prawa dostępu można zmieniać.
       Gdy proces nie posiada praw 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  sie  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 posiadającym nazwę pliku, tworzone jest  plik  specjalny
       gniazda  w  systemie  plików,  który musi zostać skasowany przez wywołującego, gdy już nie
       będzie  potrzebny  (za  pomocą  unlink(2)).  Stosuje  się  tu  zwykła  uniksowa   składnia
       opóźnionego  zamknięcia (ang. close-behind); gniazdo można skasować w dowolnym momencie, a
       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() lub recvmsg()

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

BŁĘDY

       ENOMEM Brak pamięci.

       ECONNREFUSED
              Wywołano connect(2) dla obiektu gniazda, który nie nasłuchuje. Może się to zdarzyć,
              gdy zdalne gniazdo nie istnieje lub nazwa pliku nie odnosi się do gniazda.

       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.

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

       EPROTONOSUPPORT
              Podanym protokołem nie jest PF_UNIX.

       ESOCKTNOSUPPORT
              Nieznany typ gniazda.

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

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

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

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

       ECONNRESET
              Zdalne gniazdo zostało nieoczekiwanie zamknięte.

       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).

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

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

       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.

ZOBACZ TAKŻE

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

INFORMACJE O TŁUMACZENIU

       Powyższe  tłumaczenie  pochodzi  z nieistniejącego już Projektu Tłumaczenia Manuali i może
       nie być aktualne. W  razie  zauważenia  różnic  między  powyższym  opisem  a  rzeczywistym
       zachowaniem  opisywanego  programu  lub  funkcji,  prosimy  o  zapoznanie się z oryginalną
       (angielską) wersją strony podręcznika.