最近有個項目,須要兩個進程之間傳遞大量的數據,所以考慮採用了共享 內存機制
+信號同步
,兩個進程,筆者和另一程序員開發,協議都定好了,開發很順利。
等到咱們聯合調試的時候,問題出現了,筆者開發的程序,共享內存初始化一直失敗,那叫一個汗啊!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]
代碼反覆讀了好幾遍,沒有發現問題,而後仔細閱讀了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,且他的設置爲了開機啓動,因此每次出錯的都是我了,悲催!調試
cat /proc/sys/kernel/shmmin cat /proc/sys/kernel/shmmax
或者code
sysctl -a|grep shmmin sysctl -a|grep shmmax