Provided by:
manpages-pl_20051117-1_all 
NAZWA
ipc - 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
Nieniejsza dokumentacja stara się opisać implementację w systemie Linux
mechanizmów komunikacji między procesami 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. Struktura ipc_perm
zdefiniowana w systemowym pliku nagłówkowym <sys/ipc.h> składa się z
następujących pól:
ushort cuid; /* id użytkownika tworzącego */
ushort cgid; /* id grupy tworzącego */
ushort uid; /* id właściciela */
ushort gid; /* id grupy właściciela */
ushort mode; /* uprawnieenia do odczytu/zapisu */
Pole mode struktury ipc_perm w swoich najniższych 9-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 komunikaktów
Kolejka komunikatów jest w sposób jednoznaczny identyfikowana przez
dodatnią liczbę całkowitą (jej msqid) oraz posiada skojarzoną strukturę
typu struct msquid_ds, która jest zdefiniowana w pliku <sys/msg.h>, a
składa się z następujących pól:
struct ipc_perm msg_perm;
ushort msg_qnum; /* liczba komunikatów w kolejce */
ushort msg_qbytes; /* maks. liczba bajtów w kolejce */
ushort msg_lspid; /* PID ostatnio wywołującego msgsnd */
ushort msg_lrpid; /* PID ostatnio wywołującego msgrcv */
time_t msg_stime; /* czas ostatniego msgsnd */
time_t msg_rtime; /* czas ostatniego msgrcv */
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.
msg_lrpid identyfikator procesu, który ostatni wykonał funkcję
systemową msgrcv.
msg_stime Czas ostatniego wykonania funkcji systemowej msgsnd.
msg_rtime Czas ostatniego wykonania funkcji systemowej msgcv.
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 ipc_perm sem_perm;
time_t sem_otime; /* czas ostatniej operacji */
time_t sem_ctime; /* czas ostatniej zmiany */
ushort sem_nsems; /* liczba semaforów w zestawie */
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.
sem_ctime Czas ostatniego wywołania funkcji systemowej semctl, 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 dodatnią liczbę całkowitą z zakresu od
0 do sem_nsems-1.
Semofor jest strukturą typu struct sem, która składa się z
następujących pól:
ushort semval; /* wartość semafora */
short sempid; /* PID procesu ostatniej operacji */
ushort semncnt; /* liczba oczekujących na zwiększenie semval */
ushort semzcnt; /* liczba oczekujących na semval = 0 */
semval Wartość semafora: nieujemna liczba całkowita.
sempid Identyfikator ostatniego procesu, który wykonał operację na
tym semaforze.
semncnt Liczba wstrzymanych procesów oczekujących na zwiększenie
wartości zmiennej semval.
semznt Liczba wstrzymanych procesów oczekujących aż zmienna semval
przyjmie wartość zero.
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 ipc_perm shm_perm;
int shm_segsz; /* rozmiar segmentu */
ushort shm_cpid; /* PID procesu, który utworzył segment */
ushort shm_lpid; /* PID ostatnio operującego na segmencie */
short shm_nattch; /* liczba aktualnych przyłączeń */
time_t shm_atime; /* czas ostatniego przyłą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 lub shmdt.
shm_nattch Liczba aktualnych, aktywnych przyłączeń do tego segmentu
pamięci wspólnej.
shm_atime Czas ostatniego wykonania funkcji systemowej shmat.
shm_dtime Czas ostatniego wykonania funkcji systemowej shmdt.
shm_ctime Czas ostatniego wykonania funkcji systemowej shmctl, w
wyniku którego zmienione zostało shmid_ds.
ZOBACZ TAKŻE
ftok(3), msgctl(2), msgget(2), msgrcv(2), msgsnd(2), semctl(2),
semget(2), semop(2), shmat(2), shmctl(2), shmget(2), shmdt(2)