Ich wollte die Daten in der gemeinsam genutzten Bibliothek zwischen den Prozessen teilen, die sie anhängen, und ich habe verschiedene Versuche und Fehler gemacht, aber ich war ein wenig süchtig danach, also werde ich sie als Artikel schreiben.
Im Gegensatz zu Windows-DLLs werden gemeinsam genutzte UNIX-basierte Bibliotheken im Speicherbereich jedes Prozesses abgelegt, auch wenn Variablen im globalen Bereich abgelegt sind. Daher kann die Kommunikation zwischen Prozessen nicht einfach mithilfe der gemeinsam genutzten Bibliothek durchgeführt werden. Der einfachste Weg, die von der gemeinsam genutzten Bibliothek verwendeten Daten gemeinsam zu nutzen, ist die Verwendung des gemeinsam genutzten Speichers. Hier ist also der Beispielcode.
lib_shared_memory.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/shm.h>
static void *sharedmemory; //Zeiger auf gemeinsam genutzten Speicher
static int seg_id; //Shared Memory ID
static int* pnumattachproc;//Anzahl der an den gemeinsam genutzten Speicher angeschlossenen Prozesse(Auf gemeinsam genutzten Speicher gelegt)
__attribute__ ((constructor))
void attach_shmem(void)
{
int isfirstproc = 0;
key_t key = 10;
size_t size = 1000;
//Erstellen Sie einen gemeinsamen Speicher
seg_id = shmget(key, size, IPC_CREAT | IPC_EXCL | 0660);
//Konnte nicht erstellt werden,Und wenn es einen gemeinsamen Speicher mit demselben Schlüssel gibt
if ((seg_id == -1) && (errno == EEXIST)){
//Holen Sie sich die ID dieses gemeinsam genutzten Speichers
seg_id = shmget(key, size, 0);
}else if(seg_id > 0){
//Wenn der gemeinsam genutzte Speicher erfolgreich erstellt wurde, setzen Sie ein Flag, um die Initialisierungsverarbeitung durchzuführen.
isfirstproc = 1;
}
if (seg_id == -1)
exit(1);
//Gemeinsamen Speicher anhängen
sharedmemory = shmat(seg_id, NULL, 0);
if(isfirstproc){
pnumattachproc = (int*)sharedmemory;
//Initialisieren Sie die Anzahl der angehängten Prozesse
*pnumattachproc = 0;
}
(*pnumattachproc)++; //Erhöhen Sie die Anzahl der angehängten Prozesse
}
__attribute__ ((destructor))
void detach_shmem(void)
{
(*pnumattachproc)--; //Verringern Sie die Anzahl der angehängten Prozesse
if(*pnumattachproc == 0){
//Wenn die Anzahl der angehängten Prozesse 0 erreicht,
//Geben Sie dem gemeinsam genutzten Speicher das Release-Attribut
shmctl(segid, IPC_RMID, NULL);
}
//Shared Memory trennen
(void) shmdt(sharedmemory);
}
int get_attachproc_num(void){
return *pnumattachproc;
}
Der Build verwendet die Optionen für gemeinsam genutzte Bibliotheken.
gcc -fPIC -shared -o libshm.so lib_shared_memory.c
Als Einschränkung
shmctl(segid, IPC_RMID, NULL);
Lassen Sie uns ausführen, nachdem der angehängte Prozess 0 geworden ist und die Freigabe bestätigt wurde. Wenn Sie es ausführen, wenn der angehängte Prozess vorhanden ist und ein neuer Prozess versucht, eine Verbindung zum gemeinsam genutzten Speicher herzustellen, wird ein neuer gemeinsam genutzter Speicher erstellt, obwohl er denselben Schlüssel hat. Um dies zu verhindern, wird die Anzahl der an den gemeinsam genutzten Speicher angeschlossenen Prozesse verwaltet, indem sie als Variable im gemeinsam genutzten Speicher abgelegt werden, sodass der Prozess zum Trennen der gemeinsam genutzten Bibliothek am Ende freigegeben werden kann.
Ich habe das nicht verstanden, ich habe beim Erstellen des gemeinsam genutzten Speichers eine Freigabeanforderung hinzugefügt und konnte keine Verbindung zum gemeinsam genutzten Speicher herstellen.
das ist alles.
Recommended Posts