| shmctl(2) | System Calls Manual | shmctl(2) |
shmctl - steruje segmentami pamięci dzielonej Systemu V
Standardowa biblioteka C (libc, -lc)
#include <sys/shm.h>
int shmctl(int shmid, int op, struct shmid_ds *buf);
shmctl() wykonuje operację określoną przez parametr op na segmencie pamięci dzielonej Systemu V o identyfikatorze shmid.
Parametr buf jest wskaźnikiem do struktury shmid_ds, zdefiniowanej następująco w <sys/shm.h>:
struct shmid_ds {
struct ipc_perm shm_perm; /* Prawa dostępu */
size_t 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 utworzenia/ostatniej mody-
fikacji za pomocą shmctl() */
pid_t shm_cpid; /* PID twórcy segmentu */
pid_t shm_lpid; /* PID ostatniego shmat(2)/shmdt(2) */
shmatt_t shm_nattch; /* Liczba dołączeń */
...
};
Pola struktury shmid_ds są następujące:
Struktura ipc_perm jest zdefiniowana następująco (wyróżnione pola można ustawić za pomocą IPC_SET):
struct ipc_perm {
key_t __key; /* Klucz podany w msgget() */
uid_t uid; /* Efektywny UID właściciela */
gid_t gid; /* Efektywny GID właściciela */
uid_t cuid; /* Efektywny UID twórcy */
gid_t cgid; /* Efektywny GID twórcy */
unsigned short mode; /* Uprawnienia + znaczniki */
SHM_DEST i SHM_LOCKED */
unsigned short __seq; /* Numer sekwencji */
};
Najmniej znaczące 9 bitów pola mode struktury ipc_perm definiuje uprawnienia dostępu do segmentu pamięci dzielonej. Istnieją następujące bity uprawnień:
| 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 (nie jest konieczne posiadanie uprawnienia do wykonywania, aby przeprowadzić wywołanie shmat(2) ze znacznikiem SHM_EXEC).
Poprawne wartości parametru op to:
struct shminfo {
unsigned long shmmax; /* Maksymalny rozmiar segmentu */
unsigned long shmmin; /* Minimalny rozmiar segmentu;
zawsze 1 */
unsigned long shmmni; /* Maksymalna liczba segmentów */
unsigned long shmseg; /* Maksymalna liczba segmentów,
które proces może podłączyć;
nieużywane przez jądro */
unsigned long shmall; /* Maksymalna liczba stron
pamięci dzielonej, globalna
dla systemu */
};
struct shm_info {
int used_ids; /* Liczba istniejących
obecnie segmentów */
unsigned long shm_tot; /* Całkowita liczba stron
pamięci dzielonej */
unsigned long shm_rss; /* Liczba stron pamięci dzielonej
w fizycznej pamięci */
unsigned long shm_swp; /* Liczba stron pamięci dzielonej
w przestrzeni wymiany */
unsigned long swap_attempts;
/* Nieużywane od Linuksa 2.4 */
unsigned long swap_successes;
/* Nieużywane od Linuksa 2.4 */
};
Proces wywołujący może zabronić lub zezwolić na wymianę obszarów pamięci zajmowanych przez segment, używając następujących wartości op:
Przed Linuksem 2.6.10 tylko proces uprzywilejowany mógł stosować SHM_LOCK i SHM_UNLOCK. Od Linuksa 2.6.10 nieuprzywilejowany proces może wywołać te operacje, pod warunkiem że efektywny identyfikator użytkownika odpowiada identyfikatorowi twórcy lub właściciela segmentu oraz (w przypadku SHM_LOCK) ilość pamięci do zablokowania mieści się w ograniczeniu zasobów RLIMIT_MEMLOCK (patrz setrlimit(2)).
Pomyślnie zakończone operacje IPC_INFO i SHM_INFO zwracają indeks najwyższego używanego wpisu w wewnętrznej tablicy jądra przechowującej informacje o wszystkich segmentach pamięci dzielonej. (Informacji tej można użyć w operacjach SHM_STAT lub SHM_STAT_ANY, aby otrzymać informacje o wszystkich segmentach pamięci dzielonej w systemie). Pomyślnie zakończona operacja SHM_STAT zwraca identyfikator segmentu pamięci dzielonej o indeksie przekazanym w shmid. Pozostałe operacje zwracają 0, jeżeli tylko się powiodą.
W razie wystąpienia błędu zwracane jest -1 i ustawiane errno wskazując błąd.
Linux pozwala na dołączenie (shmat(2)) segmentu pamięci dzielonej, który już został zaznaczony do usunięcia za pomocą shmctl(IPC_RMID). Ta właściwość nie jest dostępna w innych implementacjach Uniksa; przenośne aplikacje nie powinny od niej zależeć.
POSIX.1-2008.
POSIX.1-2001, SVr4.
Niektóre pola struktury struct shmid_ds były w Linuksie 2.2 typu short, ale 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 wywołania od nowych za pomocą znacznika IPC_64 w op).
Operacje IPC_INFO, SHM_STAT oraz SHM_INFO są używane przez program ipcs(1) w celu dostarczenia informacji o zajmowanych zasobach. W przyszłości operacje te mogą zostać zmodyfikowane lub przeniesione do interfejsu systemu plików /proc.
mlock(2), setrlimit(2), shmget(2), shmop(2), capabilities(7), sysvipc(7)
Tłumaczenie niniejszej strony podręcznika: Rafał Lewczuk <R.Lewczuk@elka.pw.edu.p>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.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 listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.
| 2 maja 2024 r. | Linux man-pages 6.9.1 |