Ambas llamadas son esencialmente equivalentes en Linux moderno:el primer enfoque podría usarse para acceder a la memoria compartida POSIX desde lenguajes como go (ver https://github.com/fabiokung/shm/blob/master/shm_linux.go) donde la memoria compartida POSIX no disponible de forma nativa:podría ser diferente para otro sistema operativo/versión donde la primera llamada conduciría a la creación de algún archivo o /dev/shm simplemente no está disponible y/o posiblemente un rendimiento más lento. Las reglas de combinación de rutas también pueden evolucionar de una versión a otra de librt
El primer enfoque se llama API de archivos mapeados en memoria (compatible con bibliotecas estándar)
La segunda llamada API de memoria compartida POSIX (requiere librt, también conocido como libposix en Linux como dependencia. Construye internamente la ruta y abre las llamadas)
Después de leer la fuente de shm_open
, puedo decir que esos dos métodos son casi iguales.
enlace:https://code.woboq.org/userspace/glibc/sysdeps/posix/shm_open.c.html
shm_open simplemente agrega el prefijo shm_dir y luego invoca el open
normal llamada al sistema, nada especial.
Si abre y mmap() un archivo normal, los datos terminarán en ese archivo.
Si solo necesita compartir una región de memoria, sin necesidad de conservar los datos, lo que genera una sobrecarga de E/S adicional, use shm_open().
Dicha región de memoria también le permitiría almacenar otros tipos de objetos, como mutexes o semáforos, que no puede almacenar en un archivo normal con mmap() en la mayoría de los sistemas.