Posx udostępniona pamięć z programowaniem C

Posx udostępniona pamięć z programowaniem C
Postix udostępniona pamięć to struktura komunikacji międzyprocesowej (IPC) określona w specyfikacjach POSIX. Dwa (lub więcej) zadań można od niego odczytać i zapisywać do strefy pamięci współdzielonej, ustanawiając współdzieloną pamięć. Udostępniona pamięć poz.G., rura, gniazdo itp.) i jest pożądany w przypadku niektórych programów.

Pozix udostępniane wywołania pamięci

Funkcje pamięci udix skupione na koncepcji UNIX, że obiekt musi być dokumentem podczas wykonywania czynności wejściowych/wyjściowych na encji. Dlatego, ponieważ recytujesz i wpisujesz się do wspólnego bytu pamięci POSIX, ten ostatni należy uznać za dokument. Dokument mapowany na pamięć to jednostka pamięci udix. Użyć shm_open Funkcja wywołania systemu poniżej /dev/shm, Generowane są oddzielne dokumenty pamięci współdzielonej. Istnieją tylko dwa dedykowane połączenia systemu pamięci współdzielonej z POSIX, shm_open, I shm_unlink, które są ściśle związane z otwieraniem i nie do zniesienia połączeń systemu plików. ftruncate, mmap, I Munmap Framework Calling do dokumentów są używane do wykonywania innych zadań w pamięci udix udostępnionej. Konieczne jest podłączenie programu używającego Posx udostępnionego wywołania pamięci -LRT.

Programy korzystające z udostępnionych połączeń pamięci Posx muszą przejść następujące kroki:

Za pomocą shm_open (), Formuj obiekt pamięci współdzielonej. Deskryptor dokumentu może zostać przywrócony, jeśli utworzenie obiektu się powiodło.

Z ftruncate (), Rozmiar obiektu zostanie ustalony.

Z mapa() I Map_shared, nakreśl ten obiekt w obecnej przestrzeni adresowej.

Odczyt/zapisz współdzieloną pamięć.

Przez Munmap (), nie zdeterminuj współdzielonej pamięci.

Używać zamknąć() Aby zamknąć obiekt.

Poprzez shm_unlink (), usuń obiekt w pamięci współdzielonej.

shm_open ()

Jak opisano powyżej, shm_open () służy do generowania nowego obiektu pamięci współdzielonej. Sprawia, że ​​obiekt jest dostępny dla procedury wywołania przy użyciu rewentowanego deskryptora. Poniżej znajduje się definicja tego wywołania funkcji:

>> int shm_open (const char *nazwa, int oflag, tryb mody_t);

Pierwszym parametrem jest nazwa obiektu pamięci współdzielonej. Jest to null trwający ciąg /nazwa Typ, z zastrzeżeniem, że żaden inny znak nie może być slashem innym niż jego pierwsza postać. Oflag to mała zasłona stworzona z kilkoma poprzednimi flagami przez oring, czy to via O_rdonly Lub O_RDWR. Opisane parametry wskazują, że jego obiekt współdzielony należy uformować (O_Creat), gdy jeszcze nie istnieje, a obiekt jest dostępny do czytania i pisania (O_RDWR). Ostatni argument określa zatwierdzenia katalogu dla obiektu współdzielonego.

shm_unlink ()

Shm_unlink () eliminuje podmiot pamięci udix, który był wcześniej opracowany. Deskryptor dokumentu liczb całkowity shm_open (). Zgodnie z definicją pod shm_open (), Nazwa parametru to tytuł jednostki pamięci współdzielonej. Poniżej znajduje się definicja shm_unlink () funkcjonować:

>> int shm_unlink (const char *nazwa);

ftruncate ()

Po ustawieniu obiektu, ftruncate () Metoda jest odrzucana, aby skonfigurować rozmiar encji w bajtach. Definicja funkcji jest następująca:

>> int ftruncate (int fd, off_t długość);

Podczas konstruowania wspólnej pamięci POSIX jest to rzeczywiście zero bajtów pod względem wielkości. Możesz renderować jednostkę pamięci udix z bajtami o długości wielkości ftruncate. Ftruncate daje zero wykonania. Ftruncate wyjścia -1 w przypadku awarii i errno jest ustawiony na wywołanie błędu.

mmap ()

Ostatecznie dokument mapowany na pamięć z podmiotem współużytkowanym jest ustawiony za pośrednictwem mmap () metoda. Następnie daje wskaźnik dokumentów z mapowaną pamięcią, który jest odrzucony, aby dotrzeć do jednostki pamięci współdzielonej. Poniżej znajduje się definicja mmap () funkcjonować:

>> void *mmap (void *addr, size_t długość, int prot, int flagi, int fd, off_t offset);

W tym „Addr” to adres, na który zostanie odwzorowany. „Długość” jest zakresem wspólnego jednostki pamięci. Wartości dla PROS mogą się różnić, ale użyjemy odczytu PROS | Prot Write. Istnieje kilka flag, ale mapa jest niezbędna dla współdzielonej pamięci. Teraz „FD” to deskryptor dokumentu, który został uzyskany wcześniej. Offset jest punktem, w którym mapowanie zaczyna się w wspólnej jednostce pamięci; Można również użyć wartości 0 przesunięcia. Po zakończeniu, mmap () daje wskaźnik do pozycji mapowania jednostki pamięci współdzielonej.

Munmap ()

W pozycji skierowanej przez Addr i uzyskanie wielkości, długości, Munmap Unmaps element pamięci współdzielonej. Munmap daje 0 po zakończeniu i -1 w sytuacji niedokładności, w którym to przypadku Errno jest przypisywane do wywołania błędu.

>> void MunMap (void *addr, size_t długość);

Przykład: nadawca i odbiornik

Weźmy przykład nadawcy i odbiornika. Nadawca utworzy nowy obiekt pamięci współdzielonej z nazwą /shmem-przykład i zapisz trzy cyfry do współdzielonej pamięci za pośrednictwem. Teraz odbiornik może ujawnić obiekt współdzielony i recytować trzy cyfry z pamięci. Utworzymy trzy pliki z nazwami protokół.H, nadawca.C, I odbiorca.C.

Protokół $ Touch.H
$ Touch Sender.C
$ Touch odbiornik.C

Następnie dodamy poniższy kod źródłowy do protokołu plików.h, „nadawca.c, „i” odbiornik.C.„Teraz uratujemy wszystkie i zamkniemy je.

Teraz będziemy kompilacja i dołączamy do powyższego kodu za pomocą słowa kluczowego -LRT osobno dla nadawcy.c i odbiornik.plik C. Oto polecenie:

$ gcc -o nadawca.c -Lrt
Odbiornik odbiornika $ gcc -o.c -Lrt

Teraz uruchomimy kod nadawcy za pomocą następującego polecenia. Dane wyjściowe podano poniżej.

$ ./nadawca

Uruchamiając kod nadawcy, obiekt pamięci współdzielonej został wygenerowany i można go znaleźć poniżej /dev/shm Korzystanie z polecenia poniżej:

$ ls -l /dev /sHm | Przykład Grep Shmem

Po uruchomieniu kodu odbiornika otrzymamy poniższe wyjście:

$ ./odbiorca

Ilekroć funkcja gm_unlink () jest wywoływany za pomocą odbiornika pliku.c, „obiekt /dev/shm/shmem-przykład zostanie odłączony. W takim przypadku nie otrzymasz obiektu na wyjściu, jak pokazano poniżej.

$ ls -l/dev/sHm/shmem -przykład

Wniosek

W tym artykule nauczyłeś się używać pamięci udix z programowaniem C w Ubuntu 20.04, w tym każde połączenie funkcyjne używane do ustanowienia współdzielonej pamięci. Mam nadzieję, że ten artykuł pomógł ci poprawić swoją wiedzę programistyczną i omówić wszystkie wątpliwości na ten temat.