共享内存是效率最高的 IPC ,因为他抛弃了内核这个“代理人”,直截了当地将一块裸 露的内存放在需要数据传输的进程面前,让他们自己搞,这样的代价是:这些进程必须小心 谨慎地操作这块裸露的共享内存,做好诸如同步、互斥等工作,毕竟现在没有人帮他们来管 理了,一切都要自己动手。也因为这个原因,共享内存一般不能单独使用,而要配合信号量、 互斥锁等协调机制,让各个进程在高效交换数据的同时,不会发生数据践踏、破坏等意外。
共享内存读写速度快,不经过内核,大量数据的交互。
相关API:
ftok():获取一个唯一的键值
id = shmget();开辟共享内存空间,空间只能是偶数
*p = shmat();把共享内存的空间映射进程的虚拟内存空间。
写入和读取都可以用拿到的指针p去直接修改。
如果反复写入,反复读取,数据会乱序,会产生数据践踏,需要信号量来控制写入和读取的顺序。
共享内存写数据的示例:
#include "test_shm" //自己定义了一个头文件,把所有需要的头文件放在里面
int main(){
key_t key=ftok("./",1);
int id=shmget(key,128,IPC_CREAT|IPC_EXCL|0777); //获取共享内存id
char *p=shmat(id,NULL,0);//映射
fgets(p,128,stdin);
shmdt(p); //解除映射
}
共享内存读数据的示例:
#include "test_shm" //自己定义了一个头文件,把所有需要的头文件放在里面
int main(){
key_t key=ftok("./",1); //获取键值
int id=shmget(key,128,IPC_CREAT|0666); //获取共享内存id
char *p=shmat(id,NULL,0);//映射
printf("%s\n",p);
shmdt(p); //解除映射
}