SVIPC(7) | Podręcznik programisty Linuksa | SVIPC(7) |
svipc - Mechanizmy komunikacji między procesami w Systemie V
#include <sys/msg.h> #include <sys/sem.h> #include <sys/shm.h>
Niniejsza dokumentacja stara się opisać implementację w systemie Linux mechanizmów komunikacji między procesami (IPC) Systemu V: kolejek komunikatów, semaforów oraz segmentów pamięci wspólnej. Dalej w tekście słowo zasób oznacza egzemplarz/realizację jednego z tych mechanizmów.
W przypadku każdego zasobu system korzysta z ogólnej
struktury typu struct ipc_perm, w której przechowuje
informacje niezbędne do określenia uprawnień do
wykonania operacji IPC. Struktura ipc_perm składa się z
następujących pól:
struct ipc_perm {
uid_t cuid; /* ID użytkownika - twórcy */
gid_t cgid; /* ID grupy twórcy */
uid_t uid; /* ID użytkownika właściciela */
gid_t gid; /* ID grupy właściciela */
unsigned short mode; /* prawa dostępu do odczytu i zapisu */ };
Pole mode struktury ipc_perm w swoich najniższych dziewięciu bitach przechowuje informacje o prawach dostępu do zasobu dla procesu wywołującego funkcję systemową metod IPC. Uprawnienia są interpretowane w sposób następujący:
0400 Prawo do odczytu przez użytkownika.
0200 Prawo do zapisu przez użytkownika.
0040 Prawo do odczytu przez grupę.
0020 Prawo do zapisu przez grupę.
0004 Prawo do odczytu przez innych.
0002 Prawo do zapisu przez innych.
Bity 0100, 0010 i 0001 (bity praw do uruchamiania) nie są przez system wykorzystywane. Co więcej, w przypadku zestawu semaforów "zapisz" efektywnie oznacza "zmień".
W tym samym systemowym pliku nagłówkowym zawarta jest definicja stałych symbolicznych:
Proszę zauważyć, że IPC_PRIVATE jest typu key_t, podczas gdy pozostałe stałe są polami znacznikowymi, które mogą być sumowane bitowo (OR) do jednej zmiennej typu int.
Kolejka komunikatów jest w sposób jednoznaczny
identyfikowana przez dodatnią liczbę całkowitą
(jej msqid) oraz posiada skojarzoną strukturę typu
struct msqid_ds, która jest zdefiniowana w pliku
<sys/msg.h> i składa się z
następujących pól:
struct msqid_ds {
struct ipc_perm msg_perm;
msgqnum_t msg_qnum; /* liczba komunikatów w kolejce */
msglen_t msg_qbytes; /* maksymalna liczba bajtów w kolejce */
pid_t msg_lspid; /* PID ostatniego wywołania msgsnd(2) */
pid_t msg_lrpid; /* PID ostatniego wywołania msgrcv(2) */
time_t msg_stime; /* czas ostatniego wywołania msgsnd(2) */
time_t msg_rtime; /* czas ostatniego wywołania msgrcv(2) */
time_t msg_ctime; /* czas ostatniej zmiany */ };
Semafor jest jednoznacznie identyfikowany przez dodatnią
liczbę całkowitą (jego semid) i jest skojarzony
ze strukturą typu struct semid_ds, zdefiniowaną w pliku
<sys/sem.h>, która składa się z
następujących pól:
struct semid_ds {
struct ipc_perm sem_perm;
time_t sem_otime; /* czas ostatniej operacji */
time_t sem_ctime; /* czas ostatniej zmiany */
unsigned long sem_nsems; /* liczba semaforów w zbiorze */ };
Semafor jest strukturą typu struct sem, która
składa się z następujących pól:
struct sem {
int semval; /* wartość semaforu */
int sempid; /* PID ostatnio modyfikującego procesu */ };
Segment pamięci wspólnej jest jednoznacznie
identyfikowany przez dodatnią liczbę całkowitą
(jego shmid) i jest skojarzony ze strukturą typu struct
shmid_ds, zdefiniowaną w <sys/shm.h>, która
składa się z następujących pól:
struct shmid_ds {
struct ipc_perm shm_perm;
size_t shm_segsz; /* rozmiar segmentu */
pid_t shm_cpid; /* PID twórcy */
pid_t shm_lpid; /* PID ostatniej operacji */
shmatt_t shm_nattch; /* liczba bieżących podłączeń */
time_t shm_atime; /* czas ostatniego podłączenia */
time_t shm_dtime; /* czas ostatniego odłączenia */
time_t shm_ctime; /* czas ostatniej zmiany */ };
Więcej informacji o obiektach i przestrzeniach nazw IPC w Systemie V znajduje się w podręczniku systemowym namespaces(7).
ipcmk(1), ipcrm(1), ipcs(1), lsipc(1), ipc(2), msgctl(2), msgget(2), msgrcv(2), msgsnd(2), semctl(2), semget(2), semop(2), shmat(2), shmctl(2), shmdt(2), shmget(2), ftok(3), namespaces(7)
Angielska wersja tej strony pochodzi z wydania 4.05 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów, oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Piotr Pogorzelski (PTM) <piotr.pogorzelski@ippt.gov.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ą 4.05 oryginału.
2016-03-15 | Linux |