POSIX совместно используемая память + каталоги - PullRequest
2 голосов
/ 19 августа 2010

Операционная система, над которой я работаю (IBM CNK, которая не является Linux, но в некоторой степени POSIX-совместимой), не позволяет мне просто создать новый файл или каталог в / dev / shm с помощью fopen () или mkdir ( ) соответственно. Похоже, я должен использовать shm_open (), чтобы получить дескриптор файла, а затем fdopen (), чтобы использовать общую область для ввода / вывода файла.

  • Нужно ли устанавливать размер общего региона с помощью ftruncate (), или он увеличивается автоматически? Я попробовал это, и я могу просто fprintf в регион, и это работает, но безопасно ли это? На странице руководства только сказано:

    Новый объект разделяемой памяти изначально имеет нулевую длину - размер объекта может быть установлен с помощью ftruncate (2). Недавно выделенные байты объекта общей памяти автоматически инициализируется до 0.

  • Хочу ли я mmap () региону? Я просто хочу иметь каталог с файлами в памяти.

  • Как мне создать новый каталог в / dev / shm? Это «работа с / dev / shm, как если бы это была нормальная файловая система», новая вещь? Каталоги в / dev / shm могут быть нестандартными?

Ответы [ 2 ]

1 голос
/ 30 января 2011

Я никогда не слышал о IBM CNK раньше ... но давайте сделаем некоторые обобщения из POSIX / SUS.

Он не переносим на mmap после конца файла.Вы должны вызвать ftruncate, чтобы установить конец файла перед отображением.

Наличие /dev/shm - это просто деталь реализации shm_open.Было бы POSIX-совместимым не иметь /dev/shm и реализовывать shm_open каким-либо другим способом.В Linux /dev/shm оказывается нормальной (хотя и поддерживаемой памятью) файловой системой, но вы не можете ожидать, что /dev/shm будет действовать подобно файловой системе или даже существовать.

0 голосов
/ 19 августа 2010

Предоставляет ли ваша ОС полнофункциональный mmap?Вам нужна только область общей памяти у родственников, т.е. процессов, которые вы fork удалили?Если эти два условия соблюдены, вам вообще не нужны никакие файлы, просто используйте mmap:

char *shm_area;
shm_area = mmap(NULL, mySHMsize, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0);

if (fork() == 0) {
  // Child, can access shm_area.
} else {
  // Parent, can access shm_area.
}
...