共享内存(shared memory):是Linux下的多进程之间的通信方法,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息共享内存指在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(cache)。共享内存是存在于内核级别的一种资源,在shell中可以使用ipcs命令来查看当前系统ipc中的状态,在文件系统/proc目录下有对其描述的相应文件。共享内存相比其他几种方式有着更方便的数据控制能力,数据在读写过程中会更透明。
1.创建共享内存(内核是以页为单位分配内存,当size参数的值不是系统内存页长的整数倍时,系统会分配给进程最小的可以满足size长的页数,但是最后一页的剩余部分内存是不可用的。)
2.挂接(第一次创建共享内存段时,它不能被任何进程访问。要想启动对该内存的访问,必须将其连接到一个进程的地址空间)
3.去关联(将共享内存从当前进程中分离)
共享内存分离并未删除它,
只是使得该共享内存对当前进程不再可用。
4.销毁共享内存(共享内存必须通过ipcrm -s shmid来显式删除,它的生命周期是随内核)
程序代码:
comm.c
server.c
client.c
运行结果:
共享内存是进程间通信速度最快的,它能够节省数据拷贝,但它并没有自带同步与互斥机制,需要用户自己实现。
共享内存的读写权限由它的属主(共享内存的创建者),
它的访问权限由当前进程的属主决定。
共享内存的访问权限类似于文件的访问权限。
程序源码:
comm.c
#include "comm.h"
int shm_comm(int size, int flags)
{
int key = ftok(PATHNAME, PROJ_ID);
if(key < 0)
{
perror("ftok");
return -1;
}
int shmid = shmget(key, size, flags);
return shmid;
}
int CreateShm(int size)
{
return shm_comm(size, IPC_CREAT|IPC_EXCL|0666);
}
int GetShm()
{
return shm_comm(0, IPC_CREAT);
}
int DestroyShm(int shmid)
{
if(shmctl(shmid, IPC_RMID, NULL) < 0)
{
perror("shmctl");
return -1;
}
return 0;
}
server.c
#include "comm.h"
int main()
{
int count = 0;
int shmid = CreateShm(4096);
sleep(5);
char *buf = shmat(shmid, NULL, 0); //挂接
while(count < 4096)
{
buf[count] = 'A' + count%26;
sleep(2);
count++;
buf[count] = '\0';
}
shmdt(buf); //去关联
sleep(5);
DestroyShm(shmid);
return 0;
}
client.c
#include "comm.h"
int main()
{
int shmid = GetShm();
sleep(5);
char *buf = shmat(shmid, NULL, 0);
while(1)
{
printf("%s\n", buf);
sleep(2);
}
shmdt(buf);
return 0;
}