专题 14 IPC之共享内存

来源:互联网 发布:java获取泛型class 编辑:程序博客网 时间:2024/05/22 03:06


1.概述

共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,它是在多进程之间对内存段进行映射的方式实现内存共享的。这是IPC最快捷的方式,共享内存方式的通信过程没有中间过程,共享内存直接将某段进行映射,多个进程间的共享内存是同块内存物理空间,仅仅是地址(逻辑地址)不同而已,不需要复制。


2.相关操作函数

创建共享内存函数原型:

shmget(key_tkey, size_t size, int shmflg);

shmflg的值如下:

IPC_CREAT:如果内核不存在,则创建它。

IPC_EXCL:当与IPC_CREAT一起使用时,如果内存段早已存在,则此次调用失败。


获得共享内存地址函数原型:

void*shmat(int shmid, const void *shmaddr, int shmflg);

删除共享内存函数原型:

intshmdt(const void *shmaddr);

共享内存控制函数原型:

intshmctl(int shmid, int cmd, struct shmid_ds *buf);

结构shmid_ds结构定义如下:

structshmid_ds

{

structipc_perm shm_perm; //所有者和权限

size_tshm_segsz; //段大小,以字节为单位

time_tshm_atime; //最后挂接时间

time_tshm_dtime; //最后取出时间

time_tshm_ctime; //最后修改时间

pid_tshm_cpid; //建立者的PID

pid_tshm_lpid; //最后调用函数shmat()/shmdt()PID

shmatt_tshm_nattch; //现在挂接的数量

};

3.实例

/*---------------共享内存操作实例--------------------*/

#include<stdio.h>

#include<unistd.h>

#include<stdlib.h>

#include<string.h>

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/shm.h>


#defineBUFSZ 2048

intmain()

{

intshmid;

char*shmadd;

key_tkey;


/*生成键值*/

if((key= ftok(".", 'a')) == -1)

{

perror("ftok");

exit(1);

}

if((shmid= shmget(key, BUFSZ, IPC_CREAT | 0666)) < 0)

{

perror("shmget");

exit(1);

}

else

{

printf("createdshared-memory: %d\n", shmid);

system("ipcs–m");

}

if((shmadd= shmat(shmid, 0, 0)) < (char*)0)

{

perror("shmat");

exit(1);

}

else

{

printf("attachedshared-memory\n");

system("ipcs–m");

}

if(shmdt(shmadd)< 0)

{

perror("shmdt");

exit(1);

}

else

{

printf("dettachedshared-memory\n");

system("ipcs-m");

}

exit(0);

}



原创粉丝点击