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