Name
shmctl - shared memory control
Library
libc.lib
Synopsis
|
int
shmctl (int shmid, int cmd, struct shmid_ds *buf);
|
Return values
The
shmctl
function returns the value 0 if successful; otherwise the
value -1 is returned and
errno
is set to indicate the error.
Detailed description
Performs the action specified by
cmd
on the shared memory segment identified by
shmid:
IPC_STAT
|
Fetch the segment’s
struct shmid_ds,
storing it in the memory pointed to by
buf.
|
IPC_SET
|
Changes the
shm_perm.uid,
shm_perm.gid,
and
shm_perm.mode
members of the segment’s
struct shmid_ds
to match those of the struct pointed to by
buf.
|
IPC_RMID
|
Removes the segment from the system.
The removal will not take
effect until all processes having attached the segment have exited;
however, once the IPC_RMID operation has taken place, no further
processes will be allowed to attach the segment.
|
The
shmid_ds
structure is defined as follows:
struct shmid_ds {
struct ipc_perm shm_perm; /* operation permission structure */
int shm_segsz; /* size of segment in bytes */
pid_t shm_lpid; /* process ID of last shared memory op */
pid_t shm_cpid; /* process ID of creator */
short shm_nattch; /* number of current attaches */
time_t shm_atime; /* time of last shmat() */
time_t shm_dtime; /* time of last shmdt() */
time_t shm_ctime; /* time of last change by shmctl() */
void *shm_internal; /* sysv stupidity */
};
Examples
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#define SHM_SEG_SIZE 1024
int main(void)
{
int shm_id;
char *shm_addr;
/*
* Create a shared memory segment
*/
if ((shm_id = shmget(IPC_PRIVATE, SHM_SEG_SIZE,
IPC_CREAT | IPC_EXCL | 0666))
== -1) {
printf("Shared memory create failed with errno %d\n", errno);
return -1;
}
/*
* Attach the shared memory segment to the
* process address space
*/
if((shm_addr = (char *)shmat(shm_id, NULL, 0)) == (void *)-1) {
printf("Shared memory attach failed with errno %d\n", errno);
return -1;
}
/*
* Copy data to shared memory segment
*/
strcpy(shm_addr, "some_random_data");
/*
* Detach the shared memory segment
*/
if(shmdt(shm_addr) == -1) {
printf("Shared memory detach failed with errno %d\n", errno);
}
/*
* Remove the shared memory segment
*/
if(shmctl(shm_id, IPC_RMID, NULL) == -1) {
printf("Shared memory destroy failed with errno %d\n", errno);
}
return 0;
}
Errors
The
shmctl
system call
will fail if:
[EINVAL]
|
|
Invalid operation, or
no shared memory segment was found corresponding to
shmid.
|
[EPERM]
|
|
The calling process’s uid does not match the uid of
the shared memory segment’s owner or creator.
|
[EACCES]
|
|
Permission denied due to mismatch between operation and mode of
shared memory segment.
|
See also
shmat,
shmdt,
shmget,
ftok
Feedback
For additional information or queries on this page send feedback
© 2005-2007 Nokia
|
|