shmctl

Autres langues

Langue: pl

Autres versions - même langue

Version: 2002-01-05 (openSuse - 09/10/07)

Section: 2 (Appels système)

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

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)