学习笔记-----共享内存 (SHM,即 SHared Memory)

        共享内存是效率最高的 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); //解除映射
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值