2016-04-05 4 views
0

Я могу отправить структуру через общую память, но что, если я хочу отправить myStructure [SIZE] ??Обмен вектором с mmap в C

Я пробую это с вектором целых чисел. И моя проблема начинается писателя здесь:

int fd, data_size = VECSIZE*sizeof(int), i, numbers[VECSIZE]; 
int *number; 

fd = shm_open("/ex02_1100620", O_CREAT | O_EXCL | O_RDWR, S_IRUSR | S_IWUSR); 

ftruncate(fd, data_size); 

number = numbers; 

srand((unsigned) time(NULL)); 
for(i = 0; i < SIZE; i++){ 
    number[i] = rand()% SIZE + 1; 
} 

number = (int *)mmap(NULL, data_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 

Теперь, если я что-то вроде:

number = numbers 

, а затем распечатать number[SIZE] позиции это работает, но если я печатаю number[SIZE] после ттар печатает все 0 и делает то же самое на читателя.

Я делаю это, но я думаю, что ловить ошибки, чтобы объяснить мою проблему, на самом деле не нужно.

Я читал это сообщение Sharing an array of structs using mmap, но не мог понять, что я делаю неправильно.

Если вам нужна дополнительная информация о коде, просто скажите об этом.

+0

Um, писатель здесь ничего к не пишут Общая память? – immibis

+0

Вот где у меня проблемы. Должен ли я просто использовать номер и забыть о номерах? Если это так, не следует использовать malloc вместо числа number = numbers? И как это будет работать с призывом mmap? – AimForNuts

+0

Я имею в виду, что он ничего не пишет в разделяемую память *, потому что вы не сказали этому делать это * - вы устанавливаете 'number', чтобы указывать на' numbers', а затем записывать кучу чисел через 'number' (так, чтобы массив 'numbers'), тогда вы сопоставляете некоторую общую память и устанавливаете' number', чтобы указывать на общую память. Ни в коем случае вы на самом деле не писали в общую память. – immibis

ответ

0

Давайте рассмотрим, что делает ваша программа:

  • Создать/выделить массив int называеться numbers.
  • Комплект number, чтобы указать на numbers.
  • Напиши кучу цифр через number - потому что это указывает на numbers, это то же самое, что и запись на numbers.
  • Установите карту общей памяти и установите number, чтобы указать на общую память.

То, что вы на самом деле хотите сделать это:

  • Карта некоторую общую память и установить number, чтобы указать на общую память.
  • Напишите пучок чисел через number - поскольку он указывает на общую память, это то же самое, что и запись в общую память напрямую.

Надеюсь, этого достаточно, чтобы исправить ваш код.

(Обратите внимание, что, так как общая память не имеет имя переменной, вы не можете писать к ней напрямую - именно поэтому мы используем указатель)

+0

Да, да! Спасибо за ответ, была немой ошибкой ... И теперь я понимаю, что мой второй вопрос о malloc - это глупо, потому что вам также нужно выделить некоторую общую память ... это действительно помогло. Большое спасибо. – AimForNuts

+0

(я изменил «выделить некоторую разделяемую память», чтобы «сопоставить некоторую общую память», поскольку она кажется более точной, но я не знаю, как много работает в ОС Linux) – immibis