sigmatador | Voici un bout de code qui met en évidence ce que je ne pige pas (c'est un extrait dépouillé d'un plus gros programme sur lequel je suis en ce moment): Code :
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <sys/shm.h>
- #define SIZE_MAX 32
- #define SHM_WATCH_OFFSET 0x02200000
- void *ipctool_shared_get(key_t shared_key);
- int ipctool_shared_create(key_t shared_key, char *pval, int len, size_t size, void **ppshm);
- int main(int argc, char **argv)
- {
- fprintf(stderr, "dbg0: sizeof(key_t): %i\n", sizeof(key_t));
-
- ipctool_shared_create((key_t)(SHM_WATCH_OFFSET + 80 ), NULL, 0, sizeof(void *) * SIZE_MAX, NULL);
- ipctool_shared_create((key_t)(SHM_WATCH_OFFSET + 8080), NULL, 0, sizeof(void *) * SIZE_MAX, NULL);
-
- ipctool_shared_get((key_t)(SHM_WATCH_OFFSET + 80 ));
- ipctool_shared_get((key_t)(SHM_WATCH_OFFSET + 8080));
- ipctool_shared_get((key_t)(SHM_WATCH_OFFSET + 1080));
- return 0;
- }
- void *ipctool_shared_get(key_t shared_key)
- {
- int id, *ptr;
-
- fprintf(stderr, "dbg2: shared_key: %08X\n", shared_key);
- if ((id = shmget(shared_key, 0, 0600)) == -1)
- {
- perror("ipctool_shared_get.shmget:" );
- return NULL;
- }
- if ((ptr = shmat(id, NULL, 0)) == (void *)-1)
- {
- perror("ipctool_shared_get.shmat:" );
- return NULL;
- }
- return (void *)ptr;
- }
- int ipctool_shared_create(key_t shared_key, char *pval, int len, size_t size, void **ppshm)
- {
- int id, *ptr;
-
- fprintf(stderr, "dbg1: shared_key: %08X\n", shared_key);
-
- if ((id = shmget(shared_key, size, IPC_CREAT | 0600)) == -1)
- {
- perror("ipctool_shared_create.shmget:" );
- return EXIT_FAILURE;
- }
- if ((ptr = shmat(id, NULL, 0)) == (void *)-1)
- {
- perror("ipctool_shared_create.shmat:" );
- return EXIT_FAILURE;
- }
- memset(ptr, 0, size);
- if (pval != NULL)
- {
- memcpy(ptr, pval, len);
- }
- if (ppshm == NULL)
- {
- if (shmdt(ptr) == -1)
- {
- perror("ipctool_shared_create.shmdt:" );
- return EXIT_FAILURE;
- }
- }
- else
- {
- *ppshm = ptr;
- }
- return EXIT_SUCCESS;
- }
| Si j'execute ce code, aucune erreur ne se produit, alors que pourtant cela devrait être le cas lors du dernier appel à ipctool_shared_get (aucun segment de mémoire partagé correspondant à la clé SHM_WATCH_OFFSET + 1080 n'a été crée) Si je réexecute ce code en changeant la valeur de SHM_WATCH_OFFSET de 0x02200000 à 0x00200000, cette fois l'erreur se produit bien. Pourquoi ? Aucune idée :-S La valeur de la clé est pourtant bien dans les 2 cas unique et stockable dans la taille de key_t. Si quelqu'un a une piste pour éclairer ma lanterne je suis preneur ^^. Message édité par sigmatador le 06-12-2007 à 22:49:25
|