共享内存

https://blog.youkuaiyun.com/ljianhui/article/details/10253345

共享内存+互斥量实现进程通信:https://wenku.baidu.com/view/07b216aa76eeaeaad1f330cc.html

                                                     https://www.cnblogs.com/fangshenghui/p/4039720.html

                                                     https://blog.youkuaiyun.com/szkbsgy/article/details/50458641

                                                      https://blog.youkuaiyun.com/woyimibayi/article/details/80096275

示例:https://blog.youkuaiyun.com/skyroben/article/details/72625028

读出的数据存入txt文件:https://blog.youkuaiyun.com/weixin_41770169/article/details/82628683

共享内存使用陷阱分析:https://blog.youkuaiyun.com/killmice/article/details/41516399

多线程编程:https://www.cnblogs.com/armlinux/archive/2010/05/28/2396997.html

注意:

1.共享内存结构体,变量的顺序非常重要,不能变换顺序,否则值错误。所有用共享内存的进程共享内存结构体必须完全一致。2019-06-14

2.当共享内存变大了,报错Invalid argument,errno =0,重启后还显示此错误,这是输入ipcs -m,查看系统共享内存,把对应的共享内存先删掉在创建,删除共享内存执行命令:ipcrm -m [shmid]

3.一个进程是可以对同一个共享内存多次 shmat进行挂载的,物理内存是指向同一块,如果shmaddr为NULL,则每次返回的线性地址空间都不同。而且指向这块共享内存的引用计数会增加。也就是进程多块线性空间会指向同一块物理地址。这样,如果之前挂载过这块共享内存的进程的线性地址没有被shmdt掉,即申请的线性地址都没有释放,就会一直消耗进程的虚拟内存空间,很有可能会最后导致进程线性空间被使用完而导致下次shmat或者其他操作失败。

解决方法:

可以通过判断需要申请的共享内存指针是否为空来标识是否是第一次挂载共享内存,若是则使用进行挂载,若不是则退出。

void* ptr = NULL;

...

if (NULL != ptr)

return;

ptr = shmat(shmid,ptr,0666);

附:

函数shmat将标识号为shmid共享内存映射到调用进程的地址空间中,映射的地址由参数shmaddr和shmflg共同确定,其准则为:
(1) 如果参数shmaddr取值为NULL,系统将自动确定共享内存链接到进程空间的首地址。
(2) 如果参数shmaddr取值不为NULL且参数shmflg没有指定SHM_RND标志,系统将运用地址shmaddr链接共享内存

4.ntp共享内存报错:查看哪个进程使用共享内存,执行命令ipcs -mp,查看cpid,查找对应pid的应用程序,杀死,查看ipcs -m ,重启ntpd。报错原因和建立共享内存先后有关,杀死液晶屏,由ntpd建立共享内存。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值