首页 > 编程知识 正文

linux共享内存shmget,linux创建共享内存shmget

时间:2023-05-04 10:46:21 阅读:264698 作者:2292

1. 问题引出

最近有个项目,需要两个进程之间传递大量的数据,因此考虑采用了共享 内存机制+信号同步,两个进程,笔者和另外一程序员开发,协议都定好了,开发很顺利。
等到我们联合调试的时候,问题出现了,笔者开发的程序,共享内存初始化一直失败,那叫一个汗啊!

代码如下:

/*******************************************************************************函数名称:yg_init_mem_share*功能描述: 初始化共享内存(用于存放地图校准数据)*全局影响:无*输入:*输出:无*返回值:0:成功 -1:发送失败* 作者 日期 内容* Jimmy 2018-10-16 创建*******************************************************************************/void yg_init_mem_share(int size){ key_t key; //int size = 1024*1024; //1M内存大小 //1. 创建共享内存 if(-1 == (key = ftok("/", 4))) { bv_loge("ftok failed [%d:%s]!", errno, strerror(errno)); bv_error_handle("ftok failed [%d:%s]!", errno, strerror(errno)); return ; } bv_logd("key=%#x!", key); SHM_ID = shmget(key, (size_t)size, IPC_CREAT|0644); if(-1 == SHM_ID) { bv_loge("Init the shared memory[%dKB] failed [%d:%s]!",size/1024, errno, strerror(errno)); bv_error_handle("Init the shared memory[%dKB] failed [%d:%s]!",size/1024, errno, strerror(errno)); } else { bv_logd("Init the shared memory[%dKB] OK!", size/1000); bv_file_log(g_tcp_fp, "Init the shared memory[%dKB] OK!", size/1000); } return ;}

使用errno和strerror(errno)打印错误代码:

Init the shared memory[100KB] failed [22:Invalid arguments] 2 问题解决

代码反复读了好几遍,没有发现问题,然后仔细阅读了man shmget,看到了如下一句话:

EINVAL A new segment was to be created and size is less than SHMMIN or greater than SHMMAX.EINVAL A segment for the given key exists, but size is greater than the size of that segment.

意思就是说:

shmget设置的size值,不能大于最大值SHMMAX和小于最小值SHMMIN
且如果key值对应的段已经存在,那么后来使用shmget的size值要小于等于原来的值

然后询问了一下那位程序猿,他设置的是20kB,我的是100kB,且他的设置为了开机启动,所以每次出错的都是我了,悲催!

3. 查看SHMMIN和SHMMAX cat /proc/sys/kernel/shmmincat /proc/sys/kernel/shmmax

或者

sysctl -a|grep shmminsysctl -a|grep shmmax 4. shmget使用方法

详见:https://www.cnblogs.com/52php/p/5861372.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。