SHMCTL(2)

NAZWA
shmctl - sterowanie segmentami pamięci wspólnej

SKŁADNIA
#include <sys/ipc.h>

#include <sys/shm.h>

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

OPIS
Uwaga! To tłumaczenie może być nieaktualne!

shmctl() pozwala użytkownikowi pobierać informacje dotyczące segmentu pamięci wspólnej, zmieniać właściciela, grupę i prawa dostępu do tego segmentu oraz usunąć segment. Informacje dotyczące segmentu określonego przez shmid zwracane są w strukturze shmid_ds zdefiniowanej następująco:

struct shmid_ds {
    struct ipc_perm shm_perm;  /* prawa dostępu */
    int shm_segsz;             /* rozmiar segmentu (w bajtach) */
    time_t shm_atime;          /* czas ostatniego dołączenia */
    time_t shm_dtime;          /* czas ostatniego odłączenia */
    time_t shm_ctime;          /* czas ostatniej modyfikacji */
    unsigned short shm_cpid;   /* PID twórcy segmentu */
    unsigned short shm_lpid;   /* PID ostatniego operatora segmentu */
    short shm_nattch;          /* liczba dołączeń */
    ...
};

Można nadać wartość wyróżnionym polom struktury shm_perm opisującej prawa dostępu:

struct ipc_perm
{
    key_t  key;
    ushort uid;   /* euid oraz egid właściciela segmentu */
    ushort gid;
    ushort cuid;  /* euid oraz egid twórcy segmentu */
    ushort cgid;
    ushort mode;  /* 9 najmniej znaczących bitów praw dostępu */
    ushort seq;   /* numer porządkowy */
};

Następujące polecenia mogą być przekazane za pomocą parametru cmd :

IPC_STAT
    służy do kopiowania informacji o segmencie pamięci wspólnej do bufora buf. Użytkownik musi mieć prawo do odczytu segmentu pamięci wspólnej.

IPC_SET
    służy do modyfikacji praw dostępu do segmentu. Z pola shm_perms struktury wskazanej przez parametr buf pobierane są uid, gid i mode. System uwzględnia tylko 9 najmniej znaczących bitów parametru mode. Polu shm_ctime przypisywane jest aktualny czas. Użytkownik musi być właścicielem segmentu, jego twórcą lub administratorem systemu.

IPC_RMID
    służy do zaznaczenia segmentu do usunięcia. Zostanie on naprawdę usunięty w momencie, gdy wszystkie procesy odłączą się. (Tj. gdy pole shm_nattch struktury shmid_ds opisującej segment osiągnie wartość zero.) Użytkownik musi być właścicielem segmentu, jego twórcą lub administratorem systemu.

Użytkownik musi zapewnić, że segment po użyciu zostanie na pewno usunięty. W przeciwnym przypadku, pamięć lub obszar wymiany zajmowane przez segment nie zostaną zwolnione.

Dodatkowo, administrator systemu może zabronić lub zezwolić na wymianę obszarów pam ięci zajmowanych przez segment (tylko w systemie Linux). Służą do tego następujące wartości cmd:

SHM_LOCK
    zabezpiecza segment pamięci wspólnej przed wymianą. Strony, które wcześniej uległy wymianie zostaną ponownie załadowane do pamięci dopiero w momencie, gdy użytkownik wykona do nich dostęp.

SHM_UNLOCK
    zezwala na wymianę stron należących do segmentu pamięci wspólnej.

Polecenia sterujące IPC_INFO, SHM_STAT oraz SHM_INFO są używane przez program ipcs(8) do pobierania informacji o używanych zasobach w systemie. Jeśli zajdzie potrzeba, polecenia te mogą w przyszłości ulec zmianie lub ich obsługa może zostać zawarta w systemie plików /proc.

WARTOŚĆ ZWRACANA
Funkcja zwraca 0, jeśli operacja zakończy się pomyślnie, a -1, gdy wystąpi błąd.

BŁĘDY
W przypadku wystąpienia błędu, zmiennej errno przypisana zostanie jedna z poniższych wartośći:

EACCES
    jeśli wydano polecenie IPC_STAT, a prawa dostępu określone w shm_perm.modes nie pozwalają na odczyt segmentu shmid.

EFAULT
    Parametr cmd ma wartość IPC_SET lub IPC_STAT, ale adres wskazany przez buf jest niedostępny.

EINVAL
    jeśli shmid nie jest poprawnym identyfikatorem segmentu lub cmd nie jest poprawnym poleceniem.

EIDRM
    jeśli shmid_ds wskazuje na segment, który został usunięty.

EPERM
    jeśli użytkownik próbował wywołać polecenie IPC_RMID lub IPC_SET, ale efektywny UID właściciela procesu wywołującego funkcję nie odpowiada twórcy segmentu (określonemu w shm_perm.cuid), właścicielowi segmentu (określonemu w shm_perm.uid), ani administratorowi systemu.

EOVERFLOW
    jest zwracane, gdy wydano polecenie IPC_STAT, a wartość gid lub uid jest za duża, aby ją umieścić w strukturze wskazywanej przez buf.

UWAGA
Niektóre pola struktury struct shmid_ds były w Linuksie 2.2 typu short a stały się typu long w Linuksie 2.4. Aby to wykorzystać, powinna wystarczyć rekompilacja pod glibc-2.1.91 lub nowszą. (Jądro rozróżnia stare i nowe wywołania za pomocą znacznika IPC_64 w cmd.)

ZGODNE Z
SVr4, SVID. SVr4 dokumentuje dodatkowe kody błędów: EINVAL, ENOENT, ENOSPC, ENOMEM, EEXIST. Ani SVr4 ani SVID nie dokumentują kodu błędu EIDRM.

ZOBACZ TAKŻE
shmget(2), shmop(2)

INFORMACJE O TŁUMACZENIU
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i może nie być aktualne. W razie zauważenia różnic między powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:

    man --locale=C 2 shmctl

Prosimy o pomoc w aktualizacji stron man - więcej informacji można znaleźć pod adresem http://sourceforge.net/projects/manpages-pl/.