共有メモリ-shmgetピット

2420 ワード

テキストリンク:https://www.cnblogs.com/Jimmy1988/p/9816656.html
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値は元の値よりも小さくなります.
それからそのプログラム猿に聞いてみると、彼は20 kBを設定して、私のは100 kBで、しかも彼の設定は電源を入れるために起動して、だから毎回間違いがあるのは私で、悲しいです!
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