Mam mały problem z jednym z moich projektów.
Próbowałem znaleźć dobrze udokumentowany przykład użycia pamięci współdzielonej, fork()
ale bezskutecznie.
Zasadniczo scenariusz jest taki, że kiedy użytkownik uruchamia program, muszę przechowywać dwie wartości w pamięci współdzielonej: bieżąca_ścieżka, która jest znakiem * i nazwa_pliku, która jest również znakem * .
W zależności od argumentów polecenia, nowy proces jest uruchamiany za pomocą fork()
i ten proces musi odczytać i zmodyfikować zmienną current_path przechowywaną w pamięci współdzielonej, podczas gdy zmienna nazwa_pliku jest tylko do odczytu.
Czy istnieje dobry poradnik na temat pamięci współdzielonej z przykładowym kodem (jeśli to możliwe), do którego możesz mnie skierować?
c
linux
fork
shared-memory
bleepzter
źródło
źródło
shmget()
i wsp. a także czystemmap()
podejście zMAP_ANON
(akaMAP_ANONYMOUS
) - chociażMAP_ANON
nie jest zdefiniowane przez POSIX. Istnieje również POSIXshm_open()
ishm_close()
do zarządzania obiektami pamięci współdzielonej. [… Ciąg dalszy…]shm_unlink()
), podczas gdy mechanizmy używającemmap()
wymagają pliku iMAP_SHARED
utrzymują się dane (iMAP_ANON
wyklucza trwałość). Pełny przykład znajduje się w sekcji Uzasadnienie specyfikacjishm_open()
.Odpowiedzi:
Istnieją dwa podejścia:
shmget
immap
. Porozmawiam o tymmmap
, ponieważ jest bardziej nowoczesny i elastyczny, ale możesz rzucić okiem naman shmget
( lub ten samouczek ), jeśli wolisz używać narzędzi w starym stylu.mmap()
Funkcja ta może być wykorzystywana do alokacji buforów pamięci z wysoce konfigurowalny parametry do kontroli dostępu i uprawnień, a także ich kopii z pamięci systemu plików, jeśli jest to konieczne.Poniższa funkcja tworzy bufor w pamięci, który proces może udostępniać swoim dzieciom:
Poniżej znajduje się przykładowy program, który używa funkcji zdefiniowanej powyżej do przydzielania bufora. Proces nadrzędny zapisze wiadomość, rozwidli, a następnie zaczeka, aż jego dziecko zmodyfikuje bufor. Oba procesy mogą odczytywać i zapisywać w pamięci współdzielonej.
źródło
shmget
jest naprawdę staromodnym, a niektórzy powiedzieliby, że przestarzały, sposób na współdzieloną pamięć ... Lepszy w użyciummap
ishm_open
, zwykłe pliki lub po prostuMAP_ANONYMOUS
.Oto przykład pamięci współdzielonej:
Kroki :
Użyj ftok, aby przekonwertować nazwę ścieżki i identyfikator projektu na klucz IPC Systemu V.
Użyj programu shmget, który przydziela segment pamięci współdzielonej
Użyj shmat, aby dołączyć segment pamięci współdzielonej zidentyfikowany przez shmid do przestrzeni adresowej procesu wywołującego
Wykonaj operacje w obszarze pamięci
Odłącz za pomocą shmdt
źródło
Obejmuje to korzystanie z pamięci współdzielonej
źródło
wypróbuj ten przykładowy kod, przetestowałem go, źródło: http://www.makelinux.net/alp/035
źródło
shmget
ishmat
z innego procesu), który jest czymś w rodzaju całego punktu pamięci współdzielonej ... = (Oto przykład mmap:
źródło
open
dodaje narzut plików we / wy. Użyjshm_open
zamiast tego.