共有メモリ-shmgetピット
2420 ワード
テキストリンク:https://www.cnblogs.com/Jimmy1988/p/9816656.html
1.問題の引き出し
最近、二つのプロセスの間で大量のデータを伝達するプロジェクトがあるので、
コードは次のとおりです.
errnoとstrerror(errno)を使用してエラーコードを印刷します.
2問題解決
コードは何度も繰り返し読みましたが、問題は見つかりませんでした.それから
つまり、
shmgetで設定されたsize値は、最大値SHMMAXよりも大きく、最小値SHMMINよりも小さく、key値に対応するセグメントがすでに存在する場合、shmgetを使用したsize値は元の値よりも小さくなります.
それからそのプログラム猿に聞いてみると、彼は20 kBを設定して、私のは100 kBで、しかも彼の設定は電源を入れるために起動して、だから毎回間違いがあるのは私で、悲しいです!
3.SHMMINとSHMMAXの表示
または
4.shmgetの使い方
詳細:https://www.cnblogs.com/52php/p/5861372.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