.\" Copyright 1993 Giorgio Ciucci (giorgio@crcc.it) .\" .\" 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 Sun Nov 28 17:06:19 1993, Rik Faith (faith@cs.unc.edu) .\" with material from Luigi P. Bai (lpb@softint.com) .\" Portions Copyright 1993 Luigi P. Bai .\" Modified Tue Oct 22 22:04:23 1996 by Eric S. Raymond .\" Modified, 5 Jan 2002, Michael Kerrisk .\" Modified, 19 Sep 2002, Michael Kerrisk .\" Added SHM_REMAP flag description .\" .\" Translated by Rafał Lewczuk, 24 Aug 1999 .\" Last update: A. Krzysztofowicz , Apr 2003, .\" manpages 1.54 .\" .TH SHMOP 2 2002-01-05 "Linux 2.5" "Podręcznik programisty Linuksa" .SH NAZWA shmop \- operacje na segmentach pamięci wspólnej .SH SKŁADNIA .nf .B #include .B #include .fi .sp .BI "void *shmat(int " shmid , .BI "const void *" shmaddr , .BI "int " shmflg ); .sp .BI "int shmdt(const void *" shmaddr ); .SH OPIS \fI Uwaga! To tłumaczenie może być nieaktualne!\fP .PP Funkcja .B shmat dołącza segment pamięci wspólnej o deskryptorze .B shmid do przestrzeni adresowej procesu, który ją wywołał. Adres, pod którym segment ma być widoczny jest przekazywany parametrem .IR shmaddr , przy czym system może przetworzyć ten adres w następujący sposób: .LP Jeśli .I shmaddr jest równy .BR NULL , wówczas system sam wybierze odpowiedni (nieużywany) adres, pod którym segment będzie widoczny. .LP Jeśli .I shmaddr nie jest równy .B NULL i w .I shmflg przekazany został znacznik .BR SHM_RND , wówczas segment zostanie dołączony pod adresem .I shmaddr zaokrąglonym w dół do wielokrotności .BR SHMLBA . W innym razie .I shmaddr musi być wyrównanym do granicy strony adresem, pod którym nastąpi dołączenie segmentu. .PP Jeśli w .I shmflg przekazany zostanie znacznik .BR SHM_RDONLY , wówczas segment zostanie odwzorowany z zabezpieczeniem przed zapisem. Proces wywołujący .B shmat musi mieć prawa odczytu segmentu. W przeciwnym razie w dołączanym segmencie możliwe są zarówno odczyt, jak i zapis, przy czym proces musi mieć prawa do odczytu i zapisu segmentu. Nie istnieje pojęcie segmentu pamięci wspólnej tylko do zapisu. .PP Znacznik (specyficzny dla Linuksa) .BR SHM_REMAP , który może zostać przekazany w .I shmflg oznacza, że odwzorowanie tego segmentu powinno zastąpić jakiekolwiek istniejące wcześniej odwzorowanie w zakresie rozpoczynającym się od .I shmaddr i rozciągającym na rozmiar segmentu. (Normalnie, gdy odwzorowanie w tym zakresie adresów już istnieje, powinien wystąpić błąd .BR EINVAL .) W tym przypadku .I shmaddr nie może byc równe .BR NULL . .PP Wartość .B brk procesu wywołującego funkcję nie jest zmieniana podczas dołączania segmentu. Segment zostanie automatycznie odłączony, gdy proces zakończy się. Ten sam segment może być dołączony do przestrzeni adresowej procesu jako "tylko do odczytu" lub "do odczytu i zapisu" więcej niż raz. .PP W wyniku pomyślnego wywołania .B shmat system operacyjny aktualizuje pola struktury .B shmid_ds opisującej segment w następujący sposób: .IP .B shm_atime zostaje przypisany aktualny czas. .IP .B shm_lpid zostanie przypisany identyfikator procesu wywołującego .BR shmat . .IP .B shm_nattch zostanie zwiększone o jeden. .PP Należy zwrócić uwagę, że operacja powiedzie się nawet jeśli dołączany segment pamięci wspólnej jest zaznaczony do usunięcia. .PP Funkcja .B shmdt wyłącza segment pamięci wspólnej odwzorowany pod adresem podanym w .I shmaddr z przestrzeni adresowej procesu wywołującego tę funkcję. Przekazany funkcji w parametrze .I shmaddr adres musi być równy adresowi zwróconemu wcześniej przez wywołanie .B shmat . .PP W wyniku pomyślnego wywołania .B shmdt pola struktury .B shmid_ds opisującej segment aktualizowane są w następujący sposób: .IP .B shm_dtime przypisywany jest aktualny czas. .IP .B shm_lpid przypisywany jest identyfikator procesu wywołującego .BR shmdt . .IP .B shm_nattch jest zmniejszane o jeden. Jeśli pole to osiągnie 0 i segment jest zaznaczony do usunięcia, wówczas zostanie on usunięty. .PP Obszar w przestrzeni adresowej procesu wywołującego funkcję jest zwalniany. .PP .SH "WYWOŁANIA SYSTEMOWE" .TP .B fork() W wyniku wywołania .B fork() proces potomny dziedziczy dołączone segmenty pamięci wspólnej. .TP .B exec() Po wykonaniu .B exec() wszystkie odwzorowane segmenty są odłączane (nie są usuwane). .TP .B exit() Po wykonaniu .B exit() wszystkie dołączone segmenty pamięci wspólnej są odłączane (nie są usuwane). .SH "WARTOŚĆ ZWRACANA" W przypadku wystąpienia błędu opydwie funkcje zwracają .B \-1 przypisując zmiennej .B errno kod błędu. W wyniku poprawnego wykonania funkcja .B shmat zwraca adres początku obszaru odwzorowania segmentu, natomiast funkcja .B shmdt zwraca wartość .BR 0 . .SH BŁĘDY Gdy .B shmat zakończy się niepomyślnie, zmiennej .B errno przypisywana jest jedna z następujących wartości: .TP 11 .B EACCES Proces wywołujący funkcję nie ma uprawnień do dołączenia segmentu w zadany sposób (do odczytu lub odczytu / zapisu). .TP .B EINVAL Niewłaściwa wartość parametru .IR shmid , niewyrównana do granicy strony (i nie podano \fBSHM_RND\fP), niepoprawna wartość .IR shmaddr , nieudane dołączenie pod adresem .B brk .\" FIXME What does "failing attach at brk" mean? lub został podany znacznik .BR SHM_REMAP , podczas gdy .I shmaddr jest równe .BR NULL . .TP .B ENOMEM Brak pamięci na deskryptor lub tablice stron. .PP Funkcja .B shmdt może zakończyć się niepomyślnie tylko w sytuacji, gdy pod adresem .I shmaddr nie istnieje segment pamięci wspólnej. Wowczas zmienna .B errno przyjmie wartość .BR EINVAL . .\" W rzeczywistości, powyższy opis dotyczy tego co *powinno* się dziać .\" zgodnie z POSIX. Jednakże zarówno przy jądrze 2.2.19, jak i przy 2.4.15 .\" shmdt() nigdy nie zwraca błędu, nawet gdy shmaddr jest niepoprawny. .\" (MTK, Jan 2002) .\" Has been fixed in 2.4.19 - shmdt() now returns EINVAL (MTK, Sep 2002) .SH UWAGI Używanie .B shmat z .I shmaddr równym .B NULL jest zalecaną, przenośną motodą dołączania segmentu pamięci wspólnej. Trzeba jednak być świadomym, że ta metoda dołączania segmentu pamięci wspólnej może spowodować jego dołączenie pod różnymi adresami w różnych procesach. W związku z tym wszystkie wskaźniki obsługiwane w pamięci wspólnej muszą być względne (zazwyczaj względem adresu początkowego segmentu), nie zaś bezwzględne. .LP Dla wywołania .B shmat obowiązuje następujące ograniczenie systemowe: .TP 11 .B SHMLBA Wartość, której wielokrotnością musi być adres dolnej granicy segmentu. Musi być wyrównana do granicy strony. W aktualnej implementacji .B SHMLBA jest równe .BR PAGE_SIZE . .PP Aktualna implementacja nie ma wewnętrznego ograniczenia na ilość segmentów pamięci wspólnej dołączanych do jednego procesu .RB ( SHMSEG ). .SH "ZGODNE Z" SVr4, SVID. SVr4 dokumentuje dodatkowy kod błędu EMFILE. W SVID-v4 typ parametru \fIshmaddr\fP został zmieniony z .B "char *" na .BR "const void *" , a typ wyniku zwracanego przez \fIshmat\fP() z .B "char *" na .BR "void *" . (Linuksowe libc4 i libc5 zawierają prototypy .BR "char *" ; glibc2 zawiera .BR "void *" .) .SH "ZOBACZ TAKŻE" .BR brk (2), .BR ipc (5), .BR mmap (2), .BR shmctl (2), .BR shmget (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 shmop .PP Prosimy o pomoc w aktualizacji stron man \- więcej informacji można znaleźć pod adresem http://sourceforge.net/projects/manpages\-pl/.