NAZWA¶
svipc - Mechanizmy komunikacji między procesami w Systemie V
SKŁADNIA¶
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/shm.h>
OPIS¶
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.
Prawa dostępu do zasobó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 zdefiniowana w systemowym pliku
nagłówkowym
<sys/ipc.h> 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:
- IPC_CREAT
- Utworzenie pozycji, gdy klucz nie istnieje.
- IPC_EXCL
- Błąd, gdy klucz istnieje.
- IPC_NOWAIT
- Błąd, gdy żądanie musi
czekać.
- IPC_PRIVATE
- Klucz prywatny.
- IPC_RMID
- Usunięcie zasobu.
- IPC_SET
- Ustawienie opcji zasobu.
- IPC_STAT
- Odczytanie opcji zasobu.
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.
Kolejki komunikatów¶
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 */
};
- msg_perm
- Struktura ipc_perm, która określa prawa
dostępu do kolejki komunikatów.
- msg_qnum
- Liczba komunikatów znajdujących się
aktualnie w kolejce.
- msg_qbytes
- Maksymalna liczba bajtów tekstu komunikatu, na
jaką pozwala kolejka.
- msg_lspid
- Identyfikator procesu, który ostatni wykonał
funkcję systemową msgsnd(2).
- msg_lrpid
- identyfikator procesu, który ostatni wykonał
funkcję systemową msgrcv(2).
- msg_stime
- Czas ostatniego wykonania funkcji systemowej
msgsnd(2).
- msg_rtime
- Czas ostatniego wykonania funkcji systemowej
msgrcv(2).
- msg_ctime
- Czas ostatniego wywołania funkcji systemowej, w wyniku
którego zmienione zostało pole struktury msqid_ds.
Zestawy semaforów¶
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 */
};
- sem_perm
- Struktura ipc_perm, która określa prawa
dostępu do zestawu semaforów.
- sem_otime
- Czas ostatniego wywołania funkcji systemowej
semop(2).
- sem_ctime
- Czas ostatniego wywołania funkcji systemowej
semctl(2), która zmieniła element przedstawionej
powyżej struktury lub jeden z semaforów należących do
zestawu.
- sem_nsems
- Liczba semaforów w zestawie. Każdy semafor
zestawu jest identyfikowany przez nieujemną liczbę
całkowitą z zakresu od 0 do sem_nsems-1.
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 ostatniej operacji */
};
- semval
- Wartość semafora: nieujemna liczba
całkowita.
- sempid
- Identyfikator ostatniego procesu, który wykonał
operację na tym semaforze.
Segmenty pamięci wspólnej¶
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 */
};
- shm_perm
- Struktura ipc_perm, która określa prawa
dostępu do segmentu pamięci wspólnej.
- shm_segsz
- Rozmiar segmentu pamięci wspólnej w bajtach.
- shm_cpid
- Identyfikator procesu, który utworzył ten segment
pamięci wspólnej.
- shm_lpid
- Identyfikator procesu, który ostatni wykonał
funkcję systemową shmat(2) lub shmdt(2).
- shm_nattch
- Liczba aktualnych, aktywnych przyłączeń do
tego segmentu pamięci wspólnej.
- shm_atime
- Czas ostatniego wykonania funkcji systemowej
shmat(2).
- shm_dtime
- Czas ostatniego wykonania funkcji systemowej
shmdt(2).
- shm_ctime
- Czas ostatniego wykonania funkcji systemowej
shmctl(2), w którego wyniku zmienione zostało
shmid_ds.
ZOBACZ TAKŻE¶
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)
O STRONIE¶
Angielska wersja tej strony pochodzi z wydania 3.40 projektu Linux
man-pages. Opis projektu oraz informacje dotyczące zgłaszania
błędów można znaleźć pod adresem
http://www.kernel.org/doc/man-pages/.
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika man
są: Piotr Pogorzelski (PTM) <piotr.pogorzelski@ippt.gov.pl> i
Robert Luberda <robert@debian.org>.
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.40 oryginału.