.\" Copyright (c) 1993 Luigi P. Bai (lpb@softint.com) July 28, 1993 .\" .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" .\" Modified Wed Jul 28 10:57:35 1993, Rik Faith .\" Modified Sun Nov 28 16:43:30 1993, Rik Faith .\" with material from Giorgio Ciucci .\" Portions Copyright 1993 Giorgio Ciucci .\" Modified Tue Oct 22 22:03:17 1996 by Eric S. Raymond .\" Modified, 8 Jan 2003, Michael Kerrisk, .\" Removed EIDRM from errors - that can't happen... .\" .\" Translated by Rafał Lewczuk, 9 May 1999 .\" Last update: A. Krzysztofowicz , Apr 2003, .\" manpages 1.55 .\" .TH SHMGET 2 1993-11-28 "Linux 0.99.11" "Podręcznik programisty Linuksa" .SH NAZWA shmget \- utworzenie segmentu pamięci wspólnej .SH SKŁADNIA .ad l .B #include .sp .B #include .sp .BI "int shmget(key_t " key ", int " size ", int " shmflg ); .ad b .SH OPIS \fI Uwaga! To tłumaczenie może być nieaktualne!\fP .PP Funkcja .B shmget() zwraca deskryptor segmentu pamięci wspólnej, skojarzonego z wartością (kluczem) przekazaną w parametrze .IR key . Nowy segment zostanie utworzony, Jeśli parametr .I key będzie mieć wartość .B IPC_PRIVATE lub jeśli będzie mieć inną wartość, a segment skojarzony z .I key nie istnieje zaś w parametrze .I shmflg zostanie przekazany znacznik .B IPC_CREAT (tj. .IB shmflg &IPC_CREAT nie jest równe 0), to zostanie utworzony nowy segment, a jego rozmiar będzie równy parametrowi .I size zaokrąglonemu w górę do wielokrotności .BR PAGE_SIZE . .PP Wartość .I shmflg skłąda się z: .TP 12 .BR IPC_CREAT , aby utworzyć nowy segment. Jeśli ten znaczniek nie zostanie ustawiony, to .B shmget() spróbuje znaleźć segment skojarzony z \fIkey\fP i sprzwdzić, czy użytkownik ma uprawnienia dla dostępu do segmentu. .TP .B IPC_EXCL przekazane łącznie z \fBIPC_CREAT\fP zapewnia sygnalizację błędu, jeśli segment już isnieje. .TP .B mode_flags (9 najmniej znaczących bitów) określa prawa dostępu do segmentu dla jego właściciela, grupy oraz reszty świata. Prawa uruchamiania nie są obecnie przez system używane. .PP W momencie tworzenia segmentu, prawa dostępu są kopiowane z parametru .I shmflg do pola .I shm_perm definiującej segment struktury .IR shmid_ds . Budowa struktury .IR shmid_ds : .PP .in +0.5i .nf 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 operującego procesu */ short shm_nattch; /* aktualna liczba dołączeń */ }; .fi .in -0.5i .PP .in +0.5i .nf struct ipc_perm { key_t key; ushort uid; /* euid i egid właściciela*/ ushort gid; ushort cuid; /* euid i egid twórcy */ ushort cgid; ushort mode; /* 9 najmniej znaczących bitów \fIshmflg\fP */ ushort seq; /* numer porządkowy */ }; .fi .PP Podczas tworzenia segmentu pamięci wsólnej, funkcja ta inicjalizuje strukturę .B shmid_ds w następujący sposób: .IP .B shm_perm.cuid i .B shm_perm.uid przypisywany jest efektywny identyfikator użytkownika procesu, który wywołał .BR shmget . .IP .B shm_perm.cgid i .B shm_perm.gid przypisywany jest efektywny identyfikator grupy procesu, który wywołał .BR shmget . .IP 9 najmniej znaczących bitów parametru .B shmflg jest kopiowanych do pola .BR shm_perm.mode . .IP .B shm_segsz przypisywana jest wartość parametru .IR size . .IP Polom .BR shm_lpid , .BR shm_nattch , .B shm_atime i .B shm_dtime przypisywana jest wartość .BR 0 . .IP Polu .B shm_ctime przypisywany jest aktualny czas. .PP Jeśli dany segment pamięci wspólnej już istnieje, wówczas system sprawdza prawa dostępu oraz bada, czy segment nie został zaznaczony do usunięcia. .PP .SH "WYWOŁANIA SYSTEMOWE" .TP .B fork() Po wywołaniu .B fork() proces potomny dziedziczy dołączone segmenty pamięci wspólnej. .TP .B exec() Po wywołaniu .B exec() wszystkie dołączone segmenty są odłączane (nie są usuwane). .TP .B exit() Podczas wywoływania .B exit() wszystkie dołączone segmenty są odłączane (nie są usuwane). .PP .SH "WARTOŚĆ ZWRACANA" Funkcja po pomyślnym zakończeniu zwraca deskryptor segmentu, a \-1, jeśli wystąpi błąd. .SH BŁĘDY W przypadku wystąpienia błędu, zmiennej .B errno przypisywana jest jedna z następujących wartości: .TP 12 .BR EINVAL , jeśli miał zostać utworzony nowy segment, a \fIsize\fP < \fBSHMMIN\fP lub \fIsize\fP > \fBSHMMAX\fP, lub gdy nie miał być utworzony nowy segment, a segment o podanej wartości key istnieje, lecz \fIsize\fP jest większe niż rozmiar tego segmentu. .TP .BR EEXIST , jeśli przekazane zostały znaczniki .B IPC_CREAT | IPC_EXCL , ale segment o zadanym kluczu już istnieje. .TP .B EIDRM jeśli segment został zaznaczony do usunięcia lub usunięty. .TP .B ENOSPC jeśli przekroczony został limit ilości segmentów pamięci wspólnej w systemie .RB ( SHMMNI ) lub sumarycznej wielkości wszystkich segmentów .RB ( SHMALL ). .TP .BR ENOENT , jeśli segment o zadanej wartości \fIkey\fP nie istnieje, a nie ustawiono znacznika .BR IPC_CREAT . .TP .BR EACCES , jeśli użytkownik nie ma praw dostępu do zadanego segmentu pamięci wspólnej. .TP .BR ENOMEM , gdy nie uda się przydzielić pamięci dla segmentu. .SH UWAGI .B IPC_PRIVATE nie jest znacznikiem, lecz wartością typu .BR key_t . Jeśli jako .I key zostanie użyta ta wartość specjalna, to funkcja zignoruje wszystko oprócz 9 najmniej znaczących bitów .I shmflg i utworzy nowy segment pamięci wspólnej nie posiadający klucza (jeśli wywołanie zakończy się pomyślnie). .PP Następujące ograniczenia odnoszące się do zasobów pamięci wspólnej dotyczą funkcji .BR shmget : .TP 11 .B SHMALL Maksymalna liczba stron pamięci użytych do stworzenia segmentów pamięci wspólnej: zależna od polityki. .TP .B SHMMAX Maksymalny rozmiar (w bajtach) pojedynczego segmentu pamięci wspólnej: zależny od implementacji (aktualnie 4MB). .TP .B SHMMIN Minimalny rozmiar (w bajtach) pojedynczego segmentu pamięci wspólnej: zależny od implementacji (aktualnie 1 bajt, ale efektywny minimalny rozmiar wynosi .B PAGE_SIZE ). .TP .B SHMMNI Maksymalna liczba segmentów pamięci wspólnej w systemie: zależna od implementacji (aktualnie 4096, ale w wersjach Linuksa wcześniejszych niż 2.3.99 wynosiła 128) .PP System Linux nie stawia ograniczeń dotyczących ilości segmentów dołączonych do jednego procesu .RB ( SHMSEG ). .SH USTERKI Wybrana nazwa, IPC_PRIVATE, prawdopodobnie nie jest najszczęśliwsza. IPC_NEW w sposób bardziej przejrzysty odzwierciedlało by rolę tej wartości. .SH "ZGODNE Z" SVr4, SVID. SVr4 dokumentuje dodatkowy kod błędu EEXIST. Do wersji 2.3.30 Linux zwracał EIDRM w przepadku wywołania .B shmget na segmencie pamięci wspólnej przeznaczonym do skasowania. .SH "ZOBACZ TAKŻE" .BR ftok (3), .BR ipc (5), .BR shmctl (2), .BR shmat (2), .BR shmdt (2) .SH "INFORMACJE O TŁUMACZENIU" Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i \fImoże nie być aktualne\fR. 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: .IP man \-\-locale=C 2 shmget .PP Prosimy o pomoc w aktualizacji stron man \- więcej informacji można znaleźć pod adresem http://sourceforge.net/projects/manpages\-pl/.