unix
gniazda lokalnej komunikacji międzyprocesowej
- Provided by: manpages-pl (Version: 1:0.6-2)
- Report a bug
gniazda lokalnej komunikacji międzyprocesowej
#include <sys/socket.h>
#include <sys/un.h>
unix_socket = socket(AF_UNIX, type, 0);
error = socketpair(AF_UNIX, type, 0, int *sv);
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.
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:
offsetof(struct sockaddr_un, sun_path) + strlen(sun_path) + 1
a sun_path zawiera nazwę ścieżki zakończoną znakiem NULL.
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.
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).
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.
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).
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.
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ść:
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.
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).
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.
Patrz bind(2).
Przykład użycia SCM_RIGHTS można znaleźć w cmsg(3).
recvmsg(2), sendmsg(2), socket(2), socketpair(2), cmsg(3), capabilities(7), credentials(7), socket(7)
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/.
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.