• 共享内存


    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/shmmin
    cat /proc/sys/kernel/shmmax
    

    或者

    sysctl -a|grep shmmin
    sysctl -a|grep shmmax
    

    4. shmget使用方法

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

  • 相关阅读:
    crs_stop 错误一列
    本地管理表空间和字典管理表空间的特点,ASSM有什么特点
    RAC 11.2的新特性
    oracle 11g RAC 的一些基本概念(三)
    【1】【leetcode-130】 被围绕的区域
    【leetcode-125】 验证回文串
    【1】【leetcode-127】单词接龙word-ladder
    【1】【leetcode-115】 不同的子序列 distinct-subsequences
    【1】[leetcode-124] 二叉树中的最大路径和
    [leetcode-128] 最长连续序列
  • 原文地址:https://www.cnblogs.com/Jimmy1988/p/9816656.html
Copyright © 2020-2023  润新知