现在的位置: 首页 > 综合 > 正文

内存共享

2013年05月27日 ⁄ 综合 ⁄ 共 1639字 ⁄ 字号 评论关闭

最近看流程调度的算法的时候,发现自己对共享内存的知识还是很单薄,加上进程间的通信就更难上加难了,
所以在网上找了些资料,对照程序理解了下,还是有不少的收获的,所以就把资料贴出来,收藏下,给自己
以后参考参考: 

要使用共享内存,应该有如下步骤:
1.开辟一块共享内存     shmget()
2.允许本进程使用共某块共享内存  shmat()
3.写入/读出
4.禁止本进程使用这块共享内存   shmdt()
5.删除这块共享内存     shmctl()或者命令行下ipcrm

首先,操作共享内存,我们用到了下面的函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int    shmget( key_t shmkey , int shmsiz , int flag );
void    *shmat( int shmid , char *shmaddr , int shmflag );
int     shmdt( char *shmaddr );

shmget()是用来开辟/指向一块共享内存的函数。参数定义如下:
key_t shmkey 是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替
int shmsiz 是这块内存的大小.
int flag 是这块内存的模式(mode)以及权限标识
模式可取如下值:       新建:IPC_CREAT
                       使用已开辟的内存:IPC_ALLOC
                       如果标识符以存在,则返回错误值:IPC_EXCL
然后将“模式” 和“权限标识”进行“或”运算,做为第三个参数

如:    IPC_CREAT| IPC_EXCL | 0666
这个函数成功时返回共享内存的ID,失败时返回-1。

shmat()是用来允许本进程访问一块共享内存的函数。
int shmid是那块共享内存的ID。
char *shmaddr是共享内存的起始地址
int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式
成功时,这个函数返回共享内存的起始地址。失败时返回-1。

shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数
参数char *shmaddr是那块共享内存的起始地址
成功时返回0。失败时返回-1。

此外,还有一个用来控制共享内存的shmctl()函数如下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int    shmctl( int shmid , int cmd , struct shmid_ds *buf );
int shmid是共享内存的ID。
int cmd是控制命令,可取值如下:
       IPC_STAT        得到共享内存的状态
       IPC_SET           改变共享内存的状态
       IPC_RMID        删除共享内存
struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定
返回值:成功:0
               失败:-1

 在使用共享内存,结束程序退出后。如果你没在程序中用shmctl()删除共享内存的话,一定要在命令行下用ipcrm命令删除这块共享内存。你要是不管的话,它就一直在那儿放着了。
简单解释一下ipcs命令和ipcrm命令。

取得ipc信息:
ipcs [-m|-q|-s]
-m      输出有关共享内存(shared memory)的信息
-q      输出有关信息队列(message queue)的信息
-s      输出有关“遮断器”(semaphore)的信息
%ipcs -m

删除ipc
ipcrm -m|-q|-s shm_id
%ipcrm -m 105

 

抱歉!评论已关闭.