Funkcja SHMGET 2 C

Funkcja SHMGET 2 C
Funkcja shmget () służy do budowy nowej kolejki wiadomości lub do uzyskania dostępu do istniejącej. Udostępniona pamięć jest jednym z metod komunikacji między procesami, które pozwalają na dwa lub więcej procesów szybkie wymianę danych i komunikowanie się w przestrzeni użytkownika. Udostępniona pamięć odnosi się do tego, gdy liczne procesy uzyskują dostęp do tego samego regionu pamięci i może modyfikować lub uzyskiwać dostęp do tego, w razie potrzeby. Aby wyjaśnić, każdy proces ma swój adres pamięci; Jeśli proces chce przesyłać dane z pamięci systemowej do innych procesów, dostępne są tylko mechanizmy IPC komunikacji między.

Komunikacja może wystąpić między połączonymi lub niezwiązanymi systemami, ponieważ wszyscy jesteśmy świadomi. Metoda wywołania systemu SHMGET służy albo ustanowieniu nowego segmentu pamięci współdzielonej lub zlokalizowania istniejącego za pomocą klucza. Wspólne segmenty pamięci to sekcje pamięci, do których można uzyskać dostęp w kilku procesach i które po ustaleniu pozostają dostępne, dopóki nie zostaną wyraźnie zniszczone za pomocą funkcji SHMCTL. W tym artykule pokaże, jak korzystać z funkcji wywołania systemu SHMget w języku C, aby przydzielić współdzieloną pamięć na różne sposoby.

Składnia funkcji wywołania systemu SHMGET w języku C

int shmget (klawisz key_t, rozmiar size_t, int shmflg);

Tutaj mamy ogólną składnię funkcji wywołania systemu SHMGET. Istnieją różne parametry przekazywane w funkcji SHMGET. Parametry te zostały wyjaśnione szczegółowo w następującej dyskusji.

Wartość klucza parametru jest zwracana przez shmget (), który zwraca segment pamięci współdzielonej identyfikacji systemu v. Jeśli kluczem jest IPC prywatny lub nie IPC prywatny, nie istnieje segment pamięci współdzielonej równoważny klucze, a tworzenie IPC jest zdefiniowane w shmflg, nowa segmentacja pamięci współdzielonej z wielkością równoważną wartości rozmiaru skalowanego do wielu wielu Rozmiar strony jest wytwarzany. (Jest to podobne do otwartego (2) Efekt O Creat | O.

Potrzebny rozmiar segmentu jest określony przez argument rozmiaru. Jeśli obecnie nastąpi segment, rozmiar nie może przekroczyć rozmiaru dostarczonego po jego utworzeniu. Ponadto, aby zdefiniować, którzy użytkownicy są upoważnieni do dostępu lub zmiany segmentu pamięci, można dostarczyć dowolne z organ.

Przykład

Przykładowy kod pokazuje, jak korzystać z funkcji wywołania systemu SHMget i SHMAT w jednym procesie, aby utworzyć nowy segment współdzielony, a następnie napisz do niego trochę tekstu. Przykładowy kod pokazuje również, że wiele procesów może transmitować za pomocą pamięci zbiorowej.

#włączać
#włączać
#włączać
#włączać
#włączać
#włączać
#włączać
#włączać
enum segment_size = 0x6400;
const char *data = "hej, tam!";
int main (int argc, char *argv [])
status int;
int segment_id;
segment_id = shmget (ipc_private, segment_size,
Ipc_creat | Ipc_excl | S_irusr | S_iwusr);
char *sh_mem = (char *) shmat (segment_id, 0, 0);
printf („Identyfikator segmentu %d \ n”, segment_id);
printf („przymocowany w %p \ n”, sh_mem);
memmove (sh_mem, dane, strlen (dane) +1);
printf („%s \ n”, sh_mem);
PID_T child_pid = rozwidlenie ();
if (child_pid == -1)
Perror („widelec”);
if (child_pid == 0)
strcpy (sh_mem, „nowe dane w procesie dziecka \ 0”);
printf („dziecięcy pid: %d \ n”, getpid ());
exit (exit_success);
w przeciwnym razie
PID_T ret = Waitpid (child_pid i status, wuntraceed | Wcontinued);
if (ret == -1)
Perror („Waitpid”);
if (żona (status))
printf („Status dziecka Wychodzące: %d \ n”, Wexitstatus (status));
if (Wexitstatus (status) == 0)
printf („%s \ n”, sh_mem);

shmdt (sh_mem);
shmctl (segment_id, ipc_rmid, 0);
exit (exit_success);

Po pierwsze, dołączyliśmy niektóre odpowiednie pliki nagłówka. Udostępniona zdolność pamięci jest zdefiniowana w „SYS/SHM.H ”plik nagłówka. Zacznij od implementacji kodu. Zdefiniowaliśmy rozmiar segmentu, wykorzystując metodę enum. Zmienna jest deklarowana jako dane, w których ciąg jest inicjowany. Następnie mamy główne wywołanie funkcji. W głównej funkcji tego przykładu zmienne są zdefiniowane i inicjowane. Segement_id jest inicjowany metodą SHMGET. Klucz segmentu pamięci jest pierwszym z trzech argumentów przekazanych do metody SHMGET. Jeśli należy ustalić nowy segment, kluczową wartością może być prywatny makro IPC lub kluczowa wartość istniejącego segmentu, jeśli połączenie musi uzyskać identyfikację pamięci.

Rozmiar segmentu jest określony przez drugi argument, a flagi uprawnień, które mogą być lub w celu dodania możliwych wartości, są określone przez trzeci argument SHMGET.

Identyfikator segmentu jest odbierany po utworzeniu segmentu pamięci, a następnie można go wysłać do funkcji SHMAT, aby podłączyć segment pamięci. Jako drugie wejście do SHMAT użytkownik może określić adres, w którym należy dołączyć segment pamięci. Mimo to bardziej powszechne jest zezwalanie jądrze na określenie adresu i użycie null, aby to wskazać. Funkcja PrintF drukuje wartość identyfikatora segmentu i załączoną pamięć udostępnioną i drukuje ciąg „Hej, tam”.

Generowane są główne procesu „PID_T” i proces dziecięcy „dziecko_pid”, z których każdy zapisuje odrębny ciąg w tym samym adresie. W międzyczasie proces nadrzędny zatrzymuje się i czeka na zakończenie dziecka, a następnie wychodzi z udanym kodem. Nowo zapisany ciąg jest zapisywany do konsoli. Jeśli wiele procesów musi jednocześnie zmienić i nabywać wspólne segmenty pamięci, należy zastosować techniki synchronizacji, takie jak semafory.

Wykonanie poprzedniego kodu generuje takie dane wyjściowe. Identyfikator segmentu jest generowany, wyświetlany jest adres pamięci, a ciąg jest również wydrukowany na podpowiedzi. Dziecko PID i status wychodzonego dziecka są generowane wraz z komunikatem „Nowe dane w procesie dziecka”.

Wniosek

W tym poście szczegółowo omówiliśmy funkcję wywołania systemu shmget. Funkcja shmget () pobiera identyfikację pamięci współdzielonej. Za pośrednictwem funkcji wywołania systemu SHMGET możemy uzyskać współużytkowaną pamięć. Zanim będziemy mogli użyć funkcji shmget (), musimy zaimportować wiele bibliotek. Ta funkcja zawiera parametry, które kontrolują różne funkcje. Ten post pomaga ulepszyć umiejętności programowania i rozwiązać problemy, które mogłeś mieć na temat funkcji połączenia systemowego SHMGET.