UNIX(7)

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)