Проблемы 64-битного сегмента разделяемой памяти в C \ linux - PullRequest
1 голос
/ 06 декабря 2009

Я ищу несколько IPC с сегментами разделяемой памяти в C \ Linux.

Я продолжаю создавать его как обычно:

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);

Последняя строка, где она разрывается, при компиляции она просто дает:

Warning cast to pointer from integer of a different size.

Из того, что я сделал до того, как этот код прекрасно работал на 32-битных машинах (без предупреждения) (не проверял тот же самый код, но тот же), но на моей 64-битной системе это предупреждение выдается при компиляции.

И при запуске это segfaults. Из исследования, которое я провел, я считаю, что приведение из void * к моему указателю портит указатель вверх по 64-битным причинам.

Любая идея, как я могу это исправить, ребята? Или чем это вызвано?

Ответы [ 2 ]

2 голосов
/ 06 декабря 2009

Избавьтесь от приведений и добавьте соответствующие заголовки:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
2 голосов
/ 06 декабря 2009

Похоже, что вы пропустили правильное объявление shmat(), поэтому компилятор предполагает, что он возвращает int.

Убедитесь, что у вас есть

#include <sys/shm.h>

в вашем числе.

...