Je suis sur Linux 2.6 et j'ai un problème étrange. J'ai 3 processus simultanés (fourchus à partir du même processus) qui ont besoin d'obtenir 3 segments de mémoire partagée DIFFÉRENTS, un pour chaque processus. Chacun des processus exécute ce code (s'il vous plaît noter que le type « message » est défini par l'utilisateur)Comment Linux Kernel affecte-t-il des pointeurs de mémoire lorsqu'un processus utilise shm_open()?
message *m;
int fd = shm_open("message", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
ftruncate(fd, sizeof(message));
m = mmap(NULL, sizeof(message), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
char messagename[16];
snprintf(messagename, sizeof(messagename), "%p", m);
char path[32] = "/dev/shm/";
strcat(path, messagename);
rename("/dev/shm/message", path);
Laissez-moi vous expliquer un peu: je veux que chaque processus d'allouer une zone de mémoire partagée qui contient un message. Pour m'assurer qu'un autre processus (le destinataire du message) peut accéder au même shm, je renomme ensuite mon fichier shm de "message" en une chaîne portant le nom du pointeur du message (car le processus qui le reçoit connaît déjà le pointeur). Lors de l'exécution du programme, cependant, j'ai essayé d'imprimer (à des fins de débogage) les pointeurs que chaque processus a reçu lors du mmapping du fd obtenu avec shm_open, et j'ai remarqué que tous avaient le pointeur SAME. Comment est-ce possible? J'ai pensé que peut-être d'autres processus ont fait le shm_open() après le premier et avant qu'il ait renommé le segment, donc j'ai également essayé de faire de ces lignes de code une opération atomique en utilisant un mutex partagé de processus, mais le problème persiste.
J'apprécierais vraiment toute sorte d'aide ou de suggestion.
Merci, votre idée d'utiliser pid semble bien et je vais certainement essayer. Cependant, grâce à shm_open(), je demande un pointeur de mémoire partagé (et non privé) et j'attendais un pointeur différent à chaque fois, indépendamment de l'espace de mémoire virtuelle du processus qui, je le pensais, n'est pas pertinent quand il s'agit de mémoire partagée . En outre, même si j'utilise un nom différent pour chacun des shm_open() appelés par les processus, ils ont tous la même adresse. Si shm_open() + mmap() donne un pointeur de mémoire partagée, comment peuvent-ils tous être identiques si le nom du shm est différent? –
Tout l'accès à la mémoire d'un processus passe par l'espace d'adressage virtuel de ce processus. La mémoire sous-jacente peut être partagée, mais la vue de chaque application est privée.Il peut donc apparaître à la même adresse dans chaque processus, ou différentes adresses dans différents processus, entièrement à la discrétion de l'OS. – mhsmith
... ou inversement, différents blocs de mémoire partagée peuvent apparaître à la même adresse dans différents processus, ce qui vous arrive. – mhsmith