Функция POSIX shm_open()
возвращает дескриптор файла, который можно использовать для доступа к общей памяти. Это чрезвычайно удобно, потому что можно использовать все традиционные механизмы для управления дескрипторами файлов, чтобы также управлять общей памятью.
Единственным недостатком является то, что shm_open()
всегда хочет имя файла. Поэтому мне нужно сделать это:
// Open with a clever temp file name and hope for the best.
fd = shm_open(tempfilename, O_RDWR | O_CREAT | O_EXCL, 0600);
// Immediately delete the temp file to keep the shm namespace clean.
shm_unlink(tempfilename);
// Then keep using fd -- the shm object remains as long as there are open fds.
Такое использование tempfilename
трудно сделать переносимым и надежным. Интерпретация имени файла (что такое пространство имен, как обрабатываются разрешения) отличается в разных системах.
Во многих ситуациях процессам, использующим объект совместно используемой памяти, не требуется имя файла, поскольку доступ к объекту можно получить проще и безопаснее, просто передав дескриптор файла из одного процесса в другой. Так есть ли что-то, похожее на shm_open()
, но которое можно использовать, не касаясь пространства имен имен совместно используемой памяти?
mmap()
с MAP_ANON|MAP_SHARED
замечательно, но вместо файлового дескриптора он дает указатель. Указатель не сохраняется за границей exec и не может быть отправлен другому процессу через сокет домена Unix, как дескрипторы файлов.
Файловый дескриптор, возвращаемый shm_open()
, также не выдерживает границы exec по умолчанию: определение POSIX говорит, что установлен флаг дескриптора файла FD_CLOEXEC, связанный с новым файловым дескриптором. Но это возможно сбросить флаг, используя fcntl()
на MacOS, Linux, FreeBSD, OpenBSD, NetBSD, DragonFlyBSD и, возможно, других операционных системах.