Shmget 2 C -Funktion

Shmget 2 C -Funktion
Mit der Funktion shmget () wird eine neue Meldungswarteschlange erstellt oder Zugriff auf eine vorhanden. Der gemeinsame Speicher gehört zu den Kommunikationsmethoden der Inter-Prozess, die es zwei oder mehr Prozessen ermöglichen, die Daten schnell zu vertauschen und im Benutzerbereich zu kommunizieren. Der gemeinsame Speicher bezieht sich darauf, wenn zahlreiche Prozesse auf denselben Speicherbereich zugreifen und bei Bedarf ihn ändern oder zugreifen können. Zur Klärung hat jeder Prozess seine Speicheradresse. Wenn ein Prozess die Daten aus seinem Systemspeicher auf die anderen Prozesse übertragen möchte, stehen nur die IPC-Mechanismen der Inter-Process-Kommunikation verfügbar.

Kommunikation kann zwischen den angeschlossenen oder nicht verwandten Systemen auftreten, wie wir uns alle bewusst sind. Die SHMGet -Systemaufrufmethode wird verwendet, um entweder ein neues Shared Memory Segment einzurichten oder eine vorhandene mit einem Schlüssel zu finden. Shared Memory Segmente sind Speicherabschnitte, auf die mehrere Prozesse zugegriffen werden können und die nach festgelegtem Nachbau weiterhin verfügbar sind, bis sie mit der SHMCTL -Funktion explizit zerstört werden. In diesem Artikel wird angezeigt, wie Sie die SHMGet -Systemanruffunktion in C -Sprache verwenden, um den gemeinsam genutzten Speicher auf verschiedene Weise zuzuweisen.

Syntax der Shmget -Systemaufruffunktion in C -Sprache

int shmget (KEY_T -Schlüssel, size_t Größe, int shmflg);

Hier haben wir eine allgemeine Syntax der Shmget -Systemaufruffunktion. Es gibt verschiedene Parameter, die in der Shmget -Funktion übergeben wurden. Diese Parameter werden in der folgenden Diskussion ausführlich erläutert.

Der Wert des Parameterschlüssels wird von shmget () zurückgegeben, der das Segment zur gemeinsam genutzten Identifikation des Systems des Systems V zurückgibt. Wenn der Schlüssel IPC Private oder nicht IPC Private ist, gibt Seitengröße wird erstellt. (Dies ähnelt dem offenen (2) Effekt von O Creat | o Exc).

Die erforderliche Größe des Segments wird durch das Größenargument angegeben. Wenn das Segment derzeit stattfindet, darf die Größe die bei erstellte Größe nicht überschreiten. Um zu definieren, welche Benutzer autorisiert sind, um auf das Speichersegment zuzugreifen oder zu ändern, ist eines der Behörden, die Irusr, S iwusr, s irgrp, s iwgrp, s iroth und s iwoth geliefert werden können.

Beispiel

Der Beispielcode zeigt, wie die Aufruffunktionen von Shmget und Shmat in einem einzigen Prozess verwendet werden, um ein neues gemeinsames Segment zu erstellen und danach einen Text in ihn zu schreiben. Der Beispielcode zeigt auch, dass die mehreren Prozesse mit dem kollektiven Speicher übertragen können.

#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
enum segment_size = 0x6400;
const char *data = "Hey, da!";
int main (int argc, char *argv [])
int Status;
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 ("Segment id %d \ n", Segment_id);
printf ("bei %p \ n", sh_mem);
memmove (sh_mem, data, strlen (data) +1);
printf ("%s \ n", sh_mem);
PID_T Child_pid = fork ();
if (child_pid == -1)
Perror ("Gabel");
if (mind_pid == 0)
Strcpy (sh_mem, "neue Daten im untergeordneten Prozess \ 0");
printf ("Child PID: %d \ n", getPid ());
exit (exit_success);
anders
pid_t ret = waitPID (child_pid, & status, wuntraced | wcontinued);
if (ret == -1)
perror ("waitpid");
if (wifexited (Status))
printf ("Status des Kindes beendet: %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);

Zunächst haben wir einige anwendbare Header -Dateien aufgenommen. Die gemeinsame Speicherfähigkeit ist im „SYS/SHM) definiert.H ”Header -Datei. Beginnen Sie mit der Code -Implementierung. Wir haben die Größe des Segments durch die Verwendung der Enum -Methode definiert. Die Variable wird als Daten deklariert, bei denen die Zeichenfolge initialisiert wird. Dann haben wir den Hauptfunktionsaufruf. In der Hauptfunktion dieses Beispiels werden die Variablen definiert und initialisiert. Die Segement_ID wird mit der Shmget -Methode initialisiert. Der Memory -Segment -Schlüssel ist der erste der drei Argumente, die an die Shmget -Methode übergeben wurden. Wenn ein neues Segment festgelegt werden muss, kann der Schlüsselwert das private IPC -Makro oder der Schlüsselwert eines vorhandenen Segments sein.

Die Größe des Segments wird durch das zweite Argument angegeben, und die Berechtigungsflags, die zum Hinzufügen von möglichen Werten oriert werden können, werden durch das dritte Argument von Shmget angegeben.

Die Segment -Kennung wird nach dem Bildungssegment empfangen und kann dann an die Shmat -Funktion gesendet werden, um das Speichersegment zu verbinden. Als zweite Eingabe für SHMAT kann der Benutzer die Adresse angeben, an der das Speichersegment angehängt werden soll. Trotzdem ist es häufiger, dass der Kernel die Adresse bestimmen und Null verwendet, um dies anzuzeigen. Die Printf -Funktion druckt den Segment -ID -Wert und den angehängten gemeinsam genutzten Speicher und druckt die Zeichenfolge "Hey, there".

Der primäre Prozess "PID_T" -Fabeln und ein untergeordnetes Prozess "Child_Pid" werden generiert, von denen jede eine bestimmte Zeichenfolge in derselben Adresse spart. In der Zwischenzeit hält der übergeordnete Prozess an und wartet darauf, dass das Kind fertig ist und dann mit einem erfolgreichen Code abreibt. Die neu gespeicherte Zeichenfolge ist in die Konsole geschrieben. Wenn viele Prozesse gleichzeitig die gemeinsam genutzten Speichersegmente verändern und erwerben müssen, müssen Synchronisationstechniken wie Semaphoren verwendet werden.

Die Ausführung des vorherigen Code generiert eine solche Ausgabe. Die Segment -ID wird generiert, die freigegebene Speicheradresse wird angezeigt und die Zeichenfolge wird auch auf der Eingabeaufforderung gedruckt. Die Child PID und der Status des ausgelassenen Kindes werden zusammen mit der Nachricht "Neue Daten im Kinderprozess" generiert.

Abschluss

In diesem Beitrag haben wir die SHMGet -Systemanruffunktion ausführlich durchgesehen. Die Funktion shmget () ruft die gemeinsame Speicheridentifikation des Schlüssels ab. Durch die Shmget -Systemanruffunktion können wir den gemeinsam genutzten Speicher erhalten. Bevor wir die Funktion shmget () verwenden können, müssen wir viele Bibliotheken importieren. Diese Funktion enthält die Parameter, die eine Vielzahl von Funktionen steuern. Dieser Beitrag hilft Ihnen, Ihre Programmierkenntnisse zu verbessern und die Probleme anzugehen, die Sie möglicherweise zur Aufruffunktion des Shmget -Systems hatten.