SHMCTL(2) | System Calls Manual | SHMCTL(2) |
shmctl
— shared
memory control operations
#include
<sys/shm.h>
int
shmctl
(int
shmid, int cmd,
struct shmid_ds
*buf);
The
shmctl
()
system call performs some control operations on the shared memory area
specified by shmid.
Each shared memory segment has a data structure
associated with it, parts of which may be altered by
shmctl
()
and parts of which determine the actions of
shmctl
().
This structure is defined as follows in
<sys/shm.h>
:
struct shmid_ds { struct ipc_perm shm_perm; /* operation permissions */ int shm_segsz; /* size of segment in bytes */ pid_t shm_lpid; /* pid of last shm op */ pid_t shm_cpid; /* pid of creator */ short shm_nattch; /* # of current attaches */ time_t shm_atime; /* last shmat() time*/ time_t shm_dtime; /* last shmdt() time */ time_t shm_ctime; /* last change by shmctl() */ void *shm_internal; /* sysv stupidity */ };
The
<sys/ipc.h>
and looks like
this:
struct ipc_perm { uid_t cuid; /* creator user id */ gid_t cgid; /* creator group id */ uid_t uid; /* user id */ gid_t gid; /* group id */ mode_t mode; /* r/w permission (see chmod(2)) */ u_short seq; /* sequence # (to generate unique msg/sem/shm id) */ key_t key; /* user specified msg/sem/shm key */ };
The operation to be performed by
shmctl
()
is specified in cmd and is one of:
IPC_STAT
IPC_SET
IPC_RMID
The read and write permissions on a shared memory identifier are determined by the shm_perm.mode field in the same way as is done with files (see chmod(2)), but the effective UID can match either the shm_perm.cuid field or the shm_perm.uid field, and the effective GID can match either shm_perm.cgid or shm_perm.gid.
Upon successful completion, the value 0 is returned; otherwise the value -1 is returned and the global variable errno is set to indicate the error.
shmctl
() will fail if:
EPERM
]IPC_SET
or
IPC_RMID
and the caller is not the superuser, nor
does the effective UID match either the shm_perm.uid
or shm_perm.cuid fields of the data structure
associated with the shared memory segment.
An attempt is made to increase the value of
shm_qbytes through IPC_SET
but the caller is not the superuser.
EACCES
]IPC_STAT
and the caller has no read
permission for this shared memory segment.EINVAL
]cmd is not a valid command.
EFAULT
]Segments which are marked for removal (but not yet removed since they are still in use) can be attached to by new callers using shmat(2). This is permitted as an extension beyond the standards.
December 10, 2014 | OpenBSD-7.0 |