2009-12-06 6 views
1

Je cherche à faire un IPC avec des segments de mémoire partagée dans C \ Linux.Segment de mémoire partagée 64 bits Problèmes C linux

je vais sur la création comme normale:

typedef struct { 
    int a[2]; 
} shm_segment; 

...

shm_segment *shm; 

int shm_id; 
int shm_flags = IPC_CREAT | 0666 
int shm_size = sizeof(struct shm_segment) 
key_t key = 88899; 
shm_id = shmget(key, shm_size, shm_flags); // ies this is in an if for error cheking but for example sake i omitted it 

shm = (shm_segment*)shmat(shm_id, (void*)0, 0); 

La dernière ligne est l'endroit où il se casse, à la compilation donne juste un:

Warning cast to pointer from integer of a different size. 

De ce que j'ai fait avant que ce code fonctionne parfaitement sur les machines 32 bits (pas d'avertissement) (n'a pas testé exactement le même code, mais le même), mais sur mon 64 bits, il donne cet avertissement lors de la compilation.

Et à l'exécution, il se sépare. D'après les recherches que j'ai faites, je crois que la conversion d'un vide * à mon pointeur salit le pointeur, à cause de causes 64 bits.

Toute idée comment je peux réparer ce gars? Ou qu'est-ce qui le cause?

+0

Pourquoi utiliser '(void *) 0' lorsque vous pouvez utiliser' null'? – Artelius

Répondre

2

Il semble que vous manquiez la déclaration correcte de shmat(), donc le compilateur suppose qu'il renvoie int.

Assurez-vous que vous avez

#include <sys/shm.h> 

dans votre comprend.

+0

Vous avez raison, c'était le problème. Merci caf –

2

Débarrassez des moulages et comprennent les en-têtes appropriés:

#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/types.h> 
+0

Oui, les en-têtes manquantes où le problème, merci. –

+0

Si vous n'aviez pas joué en premier lieu, vous auriez eu un meilleur avertissement :) – pmg

Questions connexes