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建立共享内存。