system V IPC —— 共享内存(上)

system V IPC —— 共享内存(上)

共享内存允许多个进程共享一给定的存储区。因为数据不需要在两个进程之间进行copy,所以这是最快的一种IPC。使用共享内存技术的时候,需要掌握好的是多个进程之间如何同步。信号量和记录锁可以用来实现共享内存的多个进程之间的同步。

linux内核定义的shared memory结构shmid_ds如下:
struct  shmid_ds {
    
struct  ipc_perm  shm_perm;   /* 权限 */
    size_t           shm_segsz; 
/* 大小 */
    pid_t            shm_lpid;  
    pid_t            shm_cpid;  
/* 创建者pid */
    shmatt_t         shm_nattch;
/* 连接到此段内存的进程数 */
    time_t           shm_atime;
    time_t           shm_dtime;
    time_t           shm_ctime;
    
};

1、创建或使用一段共享内存使用shmget函数,此函数将返回共享内存标示符。
#include  < sys / shm.h >
int  shmget(key_t key, size_t size,  int  flag);
如果key取值为IPC_PRIVATE或者key当前为和特定类型的IPC结构相结合,并且flag指定了IPC_CREAT位,则创建一个新的share memory结构。
size为共享内存段的长度(字节)。

2、对一个共享内存段进行操作使用shmctl。
#include  < sys / shm.h >
int  shmctl( int  shmid,  int  cmd,  struct  shmid_ds  * buf);
shmid指定需要操作的shared memory
cmd指定需要进行的操作
       IPC_STAT取得此段的shmid_ds结构放入buf中。
       IPC_SET用buf的值设置此段中的:shm_perm.uid,shm_perm.gid,shm_perm.mode。
       IPC_RMID从系统中删除此共享内存段。
       SHM_LOCK将共享内存锁定到内存中。
       SHM_UNLOCK解锁共享内存段。

3、将一个共享内存段连接到自己的地址空间使用shmat:
#include  < sys / shm.h >
void   * shmat( int  shmid,  const   void   * addr,  int  flag);
推荐addr取0值,将此段连接到内核选择的第一个可用的地址上。增加程序的可移植性。

4、对共享内存操作结束后,要脱离该段用shmdt:
#include  < sys / shm.h >
int  shmdt( void   * addr);
addr是shmat的返回值。

你可能感兴趣的:(system V IPC —— 共享内存(上))