简介
共享内存是到目前为止,cost最低的通信方式。由于不需要拷贝数据,共享效率非常的高。一般需要信号量等配合使用,来实现进程的同步与互斥。
API
key: 标识符的规则
size:共享存储段的字节数
flag:读写的权限
返回值:成功返回共享存储的id,失败返回-1
int shmget(key_t key, size_t size, int flag);
shmid:共享存储的id
addr:一般为0,表示连接到由内核选择的第一个可用地址上,否则,如果flag没有指定SHM_RND,则连接到addr所指定的地址上,如果flag为SHM_RND,则地址取整
flag:如前所述,一般为0
返回值:如果成功,返回共享存储段地址,出错返回-1
void *shmat(int
shmid, const void *
addr, int
flag);
addr:共享存储段的地址,以前调用shmat时的返回值
shmdt将使相关shmid_ds结构中的shm_nattch计数器值减1
int shmdt(void *addr);
int shmctl(int shmid,int cmd,struct shmid_ds *buf)
shmid:共享存储段的id
cmd:一些命令,有:IPC_STAT,IPC_RMID,SHM_LOCK,SHM_UNLOCK
0x00000000 18251824 chn89 666 2048 0
attached shared-memory
0x00000000 18251824 chn89 666 2048 1
unttached shared-memory
0x00000000 18251824 chn89 666 2048 0
delete shared-memory
示例
/*
* =====================================================================================
*
* Filename: shm_ipc.c
*
* Description: IPC using share memory
*
* Version: 1.0
* Created: 2012年02月22日 10时43分40秒
* Revision: none
* Compiler: gcc
*
* Author: chn89, chn89@126.com
* Organization:
*
* =====================================================================================
*/
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
#define BUFSZ 2048
int main(){
int shmid;
char *shmadd;
char cmd[256];
if((shmid=shmget(IPC_PRIVATE,BUFSZ,0666))<0){
perror("shmget");
exit(1);
}
else
printf("created shared-memory:%d\n",shmid);
snprintf(cmd, 256, "ipcs -m | grep %d", shmid);
system(cmd);
if((shmadd=shmat(shmid,0,0))<(char *)0){
perror("shmat");
exit(1);
}
else
printf("attached shared-memory\n");
snprintf(cmd, 256, "ipcs -m | grep %d", shmid);
system(cmd);
if((shmdt(shmadd))<0){
perror("shmdt");
exit(1);
}
else
printf("unttached shared-memory\n");
snprintf(cmd, 256, "ipcs -m | grep %d", shmid);
system(cmd);
if(shmctl(shmid, IPC_RMID, 0)<0){
perror("shmdt");
exit(1);
}
else
printf("delete shared-memory\n");
snprintf(cmd, 256, "ipcs -m | grep %d", shmid);
system(cmd);
exit(0);
}
输出结果:
created shared-memory:182518240x00000000 18251824 chn89 666 2048 0
attached shared-memory
0x00000000 18251824 chn89 666 2048 1
unttached shared-memory
0x00000000 18251824 chn89 666 2048 0
delete shared-memory