Name

shmctl - shared memory control

Library

libc.lib

Synopsis

  #include <machine/param.h>
  #include <sys/types.h>
  #include <sys/ipc.h>
  #include <sys/shm.h>
  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

Top