2015-02-08 3 views
0

Вызов со следующими параметрами:Системный вызов shmget [Linux] - выделены байты?

shmget (IPC_PRIVATE, sizeof (int), 0600);

Я пытаюсь определить, сколько байтов будет выделено блоку разделяемой памяти?

Похоже, что это имеет какое-то отношение к PAGE_SIZE (что по 4k [4096] по умолчанию на 32-битной ОС?).

+0

Я рекомендую использовать общую память POSIX. См. [Shm_overview (7)] (http://man7.org/linux/man-pages/man7/shm_overview.7.html) .... –

ответ

0

От man shmget(2):

shmget() возвращает идентификатор совместно используемой памяти System V сегмента , связанный со значением ключа аргумента. Новый сегмент разделяемой памяти с размером, равным значению размера округленного до нескольких , из PAGE_SIZE, создается, если ключ имеет значение IPC_PRIVATE или ключ не является , сегмент разделяемой памяти, соответствующий ключу, существует, и IPC_CREAT указан в shmflg.

Таким образом, в вашем случае, округление sizeof(int), который, вероятно, равна 4, будет выделять один размер страницы, да.

0

Из (Linux, специфичные) man shmget:

новый сегмент разделяемой памяти, с размером, равным значению размера округляется до кратного PAGE_SIZE, создается, если ключ имеет значение IPC_PRIVATE или клавишу не IPC_PRIVATE, сегмент разделяемой памяти, соответствующий клавише, существует, а IPC_CREAT указан в shmflg.

PAGE_SIZE определяется при компиляции ядра и на x86 обычно составляет 4 KiB. Используйте sysconf(_SC_PAGESIZE) (или getpagesize(), когда переносимость не является проблемой), чтобы получить правильное значение в байтах при запуске программы.

Однако, даже если распределение будет фактически больше, вы не должны использовать больше, чем запрашиваемый размер разделяемой памяти, поскольку POSIX позволяет реализациям выделять память точного размера, и поэтому это поведение может измениться в более поздней версии.

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