NOMBRE¶
shm_open, shm_unlink - Crea/abre o borra objetos POSIX de memoria compartida
SINOPSIS¶
#include <sys/types.h>
#include <sys/mman.h>
int shm_open(const char *name, int oflag, mode_t
mode);
int shm_unlink(const char *name);
DESCRIPCIÓN¶
shm_open crea y abre un nuevo, o abre uno ya existente, objeto POSIX de
memoria compartida. Un objeto POSIX de memoria compartida es en efecto un
manejador que puede ser utilizado por procesos no relacionados para ubicar la
misma zona de memoria compartida mediante
mmap(2). La función
shm_unlink realiza la operación inversa, borra un objeto
previamente creado con
shm_open.
La operación de
shm_open es análoga a la de
open(2).
name especifica el objeto de memoria compartida que se creará o
abrirá. Para un uso portable,
name debe comenzar con una barra (/)
y no contener ninguna barra embebida.
oflag es una máscara de bits creada mediante una operación OR
lógica de sólo una de
O_RDONLY o
O_RWDR y de cualquier
otra opción listada aquí:
- O_RDONLY
- Abre el objeto para lectura. Un objeto de memoria
compartida abierto de esta manera sólo puede ser ubicado con
mmap(2) para acceso de lectura ( PROT_READ).
- O_RDWR
- Abre el objeto para lectura-escritura.
- O_CREAT
- Crea el objeto de memoria compartida si no existe. El
usuario y grupo propietario del objeto son establecidos de igual manera
que para open(2), y los bits de permisos del objeto son
establecidos según los 9 bits de orden inferior de mode, salvo
que aquellos bits activos en la máscara de modo de creación de
ficheros del proceso (véase umask(2)) estén desactivados
para el nuevo objeto. (Una lista de macros que pueden ser utilizadas para
definir mode se puede encontrar en open(2).)
Un nuevo objeto de memoria compartida tiene longitud cero - el tamaño
del objeto puede ser modificado usando ftruncate(2). (Los bytes del
objeto de memoria compartida recién creado son automáticamente
inicializados a 0.)
- O_EXCL
- Si O_CREAT fue especificado también, y ya
existe un objeto de memoria compartida con el nombre dado name , se
devuelve un error. La comprobación de la existencia del objeto, y su
creación si no existe, se hacen de manera atómica.
- O_TRUNC
- Si el objeto de memoria compartida ya existe, lo trunca a
cero bytes.
En el caso de que
shm_open se complete con éxito se devuelve un
nuevo descriptor de fichero que hace referencia al objeto de memoria
compartida. Se garantiza que este descriptor de fichero será el
descriptor de fichero con número más bajo no abierto previamente
dentro del proceso. La opción
FD_CLOEXEC (véase
fcntl(2)) es activada para el descriptor de fichero.
El descriptor de fichero se utiliza normalmente en llamadas posteriores a to
ftruncate(2) (para un objeto recién creado) y
mmap(2).
Después de una llamada a
mmap(2) el descriptor de fichero puede
ser cerrado sin afectar al mapeo de memoria.
La operación de
shm_unlink es análoga a la de
unlink(2):
elimina un nombre de objeto de memoria compartida, y, una vez que todos los
procesos han eliminado el objeto, libera y destruye el contenido de la zona de
memoria asociada. Después de una llamada exitosa a
shm_unlink, los
intentos de abrir un objeto con
shm_open que tengan el mismo nombre
name fallarán (a menos que se especificara
O_CREAT , en
cuyo caso se crea un objeto distinto nuevo).
VALOR DEVUELTO¶
En caso de éxito,
shm_open devuelve un descriptor de fichero no
negativo. En caso de fallo,
shm_open devuelve -1.
shm_unlink
devuelve 0 en caso de éxito, o -1 en caso de error.
ERRORES¶
En caso de fallo,
errno se modifica para indicar la causa del error. Los
valores que pueden aparecer en
errno incluyen los siguientes:
- EACCES
- Se denegó el acceso a name en shm_open
en el modo mode especificado, o se especificó la opción
O_TRUNC y el invocador no tiene permisos de escritura sobre el
objeto.
- EACCES
- Se denegó el acceso para borrar el objeto de memoria
compartida con shm_unlink.
- EEXIST
- Se especificaron las opciones O_CREAT y
O_EXCL a la función shm_open y el objeto de memoria
compartida especificado por name ya existe.
- EINVAL
- El argumento name para la función
shm_open es inválido.
- EMFILE
- El proceso ya ha alcanzado el número máximo de
ficheros abiertos.
- ENAMETOOLONG
- La longitud de name excede PATH_MAX.
- ENFILE
- El límite en el número total de ficheros abiertos
en el sistema ha sido alcanzado.
- ENOENT
- Se llamó a shm_open con un nombre name
que no existe, y no se especificó la opción O_CREAT.
- ENOENT
- Se llamó a shm_unlink con un nombre name
que no existe.
OBSERVACIONES¶
Estas funciones están presentes en glibc 2.2 y posteriores. Los programas
que usen estas funciones deben especificar la opción
-lrt a
cc para enlazar con la biblioteca requerida ("realtime").
POSIX deja el comportamiento de la combinación de
O_RDONLY y
O_TRUNC indefinido. En Linux, ésto truncará con éxito un
objeto de memoria compartida - ésto puede no ser así en otros
sistemas Unix.
La implementación del objeto POSIX de memoria compartida en Linux 2.4
utiliza un sistema de ficheros dedicado, que es montado habitualmente bajo
/dev/shm.
POSIX 1003.1 (2001).
VÉASE TAMBIÉN¶
mmap(2),
open(2),
close(2),
ftruncate(2),
fstat(2),
fchown(2),
fchmod(2),
umask(2),
fcntl(2)