Общая память со структурой и int - PullRequest
0 голосов
/ 27 ноября 2018

Итак, у меня возникла эта проблема, поэтому я хочу добавить «одну» структуру и один int в свою общую память. И я хочу, чтобы мой «int находился в первой позиции разделяемой памяти» (поскольку мне понадобится этот int в другойпрограммы), а затем иметь структуру Это мой код

int id = shmget( 0x82488, (sizeof(student)) + sizeof(int) ,IPC_CREAT | 0666 );
exit_on_error (id, "Error");

int *p = shmat(id,0,0);
exit_on_null(p,"Erro no attach");

Student *s = shmat(id,0,0);
exit_on_null (s,"Error");

И теперь возникает мой вопрос, так как у меня есть 2 указателя, как я могу сделать int первым, а затем структуру, если я просто

p[0]=100 s[1] = (new Student)

1 Ответ

0 голосов
/ 27 ноября 2018

Я бы просто сделал

int *p = shmat(id,0,0);
exit_on_null(p,"Erro no attach");

Student *s = (Student*)(void*)(p + 1);

, чтобы s указывал на то, где будет следующий int, если это будет int.

Это немного сложно, но очищаетвсе возможные проблемы взаимодействия с возможными байтами заполнения в структуре.

Пример:

+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+---+---+---+---+---+---+---+---+---+---+

В этом случае p указывает на местоположение 0 (относительно начала буфера)и, таким образом, p + 1 указывает на позицию 4 (если int имеет 32 бита).Приведение p + 1, как я делаю, делает pont s в это место, но имеет тип Student *.

И если вы хотите добавить структуру struct extension, вы делаете то же самое:

struct extension *x = (struct extension*)(void*)(s + 1);

Он указывает сразу за Struct и, опять же, имеет правильный тип указателя.

...