键盘上的舞者

My Email: marckywu@gmail.com
随笔 - 19, 文章 - 0, 评论 - 3, 引用 - 0
数据加载中……

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的返回值。

posted on 2009-08-20 14:48 Marcky 阅读(358) 评论(0)  编辑 收藏 引用 所属分类: Linux


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理