共享內存 - shmget填坑記

1. 問題引出

最近有個項目,須要兩個進程之間傳遞大量的數據,所以考慮採用了共享 內存機制+信號同步,兩個進程,筆者和另一程序員開發,協議都定好了,開發很順利。
等到咱們聯合調試的時候,問題出現了,筆者開發的程序,共享內存初始化一直失敗,那叫一個汗啊!php

代碼以下:html

/******************************************************************************
*函數名稱: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,看到了以下一句話:less

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.

意思就是說:tcp

shmget設置的size值,不能大於最大值SHMMAX和小於最小值SHMMIN
且若是key值對應的段已經存在,那麼後來使用shmget的size值要小於等於原來的值函數

而後詢問了一下那位程序猿,他設置的是20kB,個人是100kB,且他的設置爲了開機啓動,因此每次出錯的都是我了,悲催!調試

3. 查看SHMMIN和SHMMAX

cat /proc/sys/kernel/shmmin
cat /proc/sys/kernel/shmmax

或者code

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

4. shmget使用方法

詳見:http://www.javashuo.com/article/p-wjbgsbtq-dv.htmlhtm

相關文章
相關標籤/搜索