Je travaille avec des segments de mémoire partagée et j'ai rencontré ce problème de bizzare.Problème d'initialisation de mémoire partagée (c)
Je suis en train de partager un struct entre de nombreux processus:
struct shmstruct{
int pid[50];
char user[50][10];
};
struct shmstruct *shmobj;
void *shmp;
int main()
{
//server creates shared memory
if((shmid = shmget((key_t)1234,sizeof(struct shmstruct),0666|IPC_CREAT)) == -1){
fprintf(stderr,"shmget failed\n");
exit(EXIT_FAILURE);
}
//server attaches shared memory segment to pointer (void *)
if((shmp = shmat(shmid,(void *) 0,0)) == (void *)-1){
fprintf(stderr,"shmat failed\n");
exit(EXIT_FAILURE);
}
//structure is now linked with shared memory pointer
printf("Memory attached at %X\n",shmp);
shmobj = (struct shmstruct *)shmp;
int i;
for(i = 0; i < 50; i++)
if(shmobj->pid[i]!=0)
printf("shminit:i:%d user:%s pid:%d\n", i, shmobj->user[i], shmobj->pid[i]);
}
Mais chaque fois que je crée et fixer le segment de mémoire partagée, shmobj-> pid [1] est déjà initialisé avec la valeur 2673!
Le résultat de printf est TOUJOURS:
shminit:i:1 user: pid:2673
Toutes les idées sur les raisons de ce qui se passe?
Merci d'avance!
Merci beaucoup pour votre avis! Il semble que IPC_PRIVATE peut m'assurer que je reçois un nouveau segment de shm frais. Puis-je avoir une confirmation à ce sujet? –
@Littledot, je pense à partir de la mémoire qui fonctionnera si vous créez le segment d'abord, puis fourchez les enfants. Sinon, il n'y a aucun moyen de réellement partager la mémoire. – paxdiablo
c'est exactement ce que je fais. Forking enfants et partage de la mémoire avec leurs parents. Désolé de ne pas avoir mis ça. –