2009-12-06 2 views
1

Я ищу несколько IPC с разделяемыми сегментами памяти в C \ Linux.64-разрядный сегмент разделяемой памяти Проблемы с 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-битных причин.

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

+0

Почему использование '(пустота *) 0 ', когда вы могли бы использовать' NULL'? – Artelius

ответ

2

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

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

#include <sys/shm.h> 

в вашем включает.

+0

Вы правы, в этом была проблема. Спасибо caf –

2

Избавиться от слепков и включают в себя соответствующие заголовки:

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

Да, пропавшие заголовки, где проблема, спасибо. –

+0

Если бы вы не бросили в первую очередь, вы бы получили лучшее предупреждение :) – pmg

Смежные вопросы