C passer le pointeur vide en utilisant la mémoire partagée

J’ai besoin de transmettre void handler à une autre application. Pour reproduire le scénario, j’ai créé un petit programme à l’aide de la mémoire partagée et essayer de transmettre le pointeur Void à une autre application et d’imprimer la valeur. lorsque j’essaie de déréférencer le crash de la deuxième application du pointeur.

Voici l’exemple d’application wire.c.

#include  #include  #include  int main() { key_t key=1235; int shm_id; void *shm; void *vPtr; shm_id = shmget(key,10,IPC_CREAT | 0666); shm = shmat(shm_id,NULL,NULL); sprintf(shm,"%d",&vPtr); printf("Address is %p, Value is %d \n", (void *)&vPtr, * (int *)vPtr); return; } 

Voici read.c

 #include  #include  #include  #include  int main() { key_t key=1235; int shm_id; void *shm; void *p = (void *)malloc(sizeof(void)); shm_id = shmget(key,10,NULL); shm = shmat(shm_id,NULL,NULL); if(shm == NULL) { printf("error"); } sscanf(shm,"%d",&p); printf("Address is %p %d\n",(void *)p); return 0; } 

Quand j’essaie de déréférencer p, il plante. J’ai besoin de transmettre l’adresse du pointeur vide et la valeur dans la deuxième application.

Je ne veux pas partager la valeur entre les applications, cela fonctionne en utilisant la mémoire partagée, je sais.

Par défaut, void * ptr aura une valeur garbadge (par exemple, add = 0xbfff7f, value = 23456), pouvez-vous s’il vous plaît me dire, comment puis-je passer l’adresse du pointeur vide à une autre application et à partir de la seconde application utilisant cette adresse, je peux imprimer la valeur trouvée lors de la première application (c’est-à-dire 23456).

Hormis la mémoire partagée, existe-t-il une autre solution de remplacement?

Merci.

Ceci est probablement dû au fait que le pointeur est toujours virtuel; il pointe vers la mémoire partagée, mais rien ne garantit que deux processus partageant la même mémoire la mappe à la même adresse virtuelle. Les adresses physiques sont bien sûr les mêmes (c’est la même mémoire réelle après tout), mais les processus ne traitent jamais avec des adresses physiques.

Vous pouvez essayer de demander une adresse spécifique en utilisant mmap() (sous Linux) pour effectuer le partage. Vous pouvez également vérifier la théorie des adresses virtuelles en imprimant simplement les adresses du bloc de mémoire partagée dans les deux processus.

De même, ne convertissez pas la valeur de retour de malloc() en C et n’allouez pas de mémoire lorsque vous utiliserez la mémoire partagée. Cette partie n’a aucun sens.

Si vous souhaitez appeler une fonction dans un processus à partir d’un autre processus, ce n’est pas IPC.
IPC partage des données entre plusieurs threads / processus.

Envisagez d’append la fonction partagée dans une DLL / un object partagé pour partager le code entre plusieurs processus. Sinon, vous pouvez append la prise en charge RPC à vos exécutables, comme indiqué ici .


Pourquoi passer des pointeurs de fonction entre 2 processus ne fonctionne pas?

Un pointeur de fonction est une adresse virtuelle faisant référence à l’emplacement de la mémoire physique où le code de la fonction est actuellement chargé dans la mémoire physique. Chaque fois qu’un pointeur de fonction (adresse virtuelle) est mentionné dans le processus, le kernel est responsable de l’exécution du mappage sur l’adresse physique. Cela réussit car le mappage est présent dans les tables de pages du processus en cours.

Cependant, lorsqu’un changement de contexte se produit et qu’un autre processus est en cours d’exécution, les tables de pages contenant les mappages de ce processus particulier sont chargées et actuellement actives. ils ne contiendront PAS le mappage du pointeur de fonction du processus précédent. Par conséquent, toute tentative d’utilisation du pointeur de fonction depuis un autre processus échouera.

Pourquoi les tables de pages NE contiennent PAS le mappage de la fonction dans un autre processus?

Si cela était fait, il n’y aurait aucun avantage à avoir plusieurs processus. Tout le code pouvant être exécuté devra être chargé simultanément dans la mémoire physique. En outre, le système tout entier constituerait alors un processus unique.

En pratique, chaque fois qu’un changement de contexte se produit et qu’un processus différent est en cours d’exécution, les segments de code / données du processus précédent peuvent même être remplacés par la mémoire physique. Par conséquent, même maintenir un pointeur de fonction et le passer au nouveau processus est inutile car cela ne garantit pas que le code de la fonction sera conservé en mémoire même après le chargement du nouveau processus en mémoire et le début de son exécution.

C’est illégal:

 void *p = (void *) malloc(sizeof(void)); 

void est un type incomplet, sizeof(void) est invalide. Vous ne pouvez pas faire cela pour la même raison que vous ne pouvez pas déclarer une variable vide:

 void i; /* WRONG */ 

Qu’est-ce qui se passe lorsque vous déréférence p est indéfini. Si vous voulez juste la valeur du pointeur, vous n’avez pas besoin d’appeler malloc sur read.c – c’est tout le concept de mémoire partagée – s’il est partagé, pourquoi read.c -vous de l’espace sur le programme de lecture?