Scroll to navigation

SVIPC(7) Podręcznik programisty Linuksa SVIPC(7)

NAZWA

sysvipc - mechanizmy komunikacji między procesami w Systemie V

SKŁADNIA

#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 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    odczyt przez użytkownika.
    0200    zapis przez użytkownika.
    0040    odczyt przez grupę.
    0020    zapis przez grupę.
    0004    odczyt przez pozostałych.
    0002    zapis przez pozostałych.

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 ostatnio modyfikującego procesu */
};


semval
Wartość semafora: nieujemna liczba całkowita.
sempid
PID ostatniego procesu, który wykonał zmodyfikował wartość tego semafora.

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.

Przestrzenie nazw IPC

Więcej informacji o obiektach i przestrzeniach nazw IPC w Systemie V znajduje się w podręczniku systemowym ipc_namespaces(7).

ZOBACZ TAKŻE

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), ipc_namespaces(7)

O STRONIE

Angielska wersja tej strony pochodzi z wydania 5.04 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/.

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Piotr Pogorzelski <piotr.pogorzelski@ippt.gov.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres manpages-pl-list@lists.sourceforge.net.

10 października 2019 r. Linux