Linux c共有メモリshmgetパラメータの紹介IPC_CREAT、IPC_EXCL、0666



Linux C Shared Memory Shmget Parameter Introduction Ipc_creat



int shmget(key_t key、size_t size、int flag)
キー:識別子のルール
サイズ:共有ストレージのバイト数
フラグ:読み取りおよび書き込み権限には、IPC_CREATまたはIPC_EXCLに対応するファイルのO_CREATまたはO_EXCLも含まれます
戻り値:共有ストレージのIDを正常に返します。それ以外の場合は、-1を返します。

key_tキー



キーは、共有メモリキー値0 / IPC_PRIVATEを識別します。キー値がIPC_PRIVATEの場合、キー値が0の場合、関数shmget()は新しい共有メモリを作成し、パラメータshmflgにIPC_PRIVATEフラグが設定されていると、新しい共有メモリも作成されます。
IPC通信モードでは、メッセージキュー、共有メモリ、またはセマフォを使用するかどうかに関係なく、各IPCオブジェクトには「キー」(キー)と呼ばれる一意の名前があります。 「キー」を介して、プロセスは使用されているオブジェクトを識別できます。 'key'とIPCオブジェクトの関係は、ファイルのファイル名と同じです。ファイル名を使用して、プロセスはファイル内のデータの読み取りと書き込みを行うことができ、複数のプロセスでさえファイルを共有できます。 IPC通信モードでは、「キー」を使用すると、IPCオブジェクトを複数のプロセスで共有することもできます。
LinuxシステムのSystemVのIPCオブジェクトを表すすべてのデータ構造には、IPCオブジェクトのキー値を含むipc_perm構造が含まれています。このキーは、SystemVでIPCオブジェクトを見つけるために使用されます。参照ID。 'key'を使用しない場合、プロセス自体が使用するメモリにIPCオブジェクトが存在しないため、プロセスはIPCオブジェクトにアクセスできません。
通常、私のプログラムが他のプログラムと一意のキー値を事前に指定できることを望んでいますが、実際には、プログラムがメモリを共有できないため、常に整列できるとは限りません。キーを選択します。したがって、ここではキーがIPC_PRIVATEに設定されているため、オペレーティングシステムはキーを無視し、新しい共有メモリを作成し、キー値を指定して、この共有メモリのIPC識別子IDを返します。また、この新しい共有メモリ識別子IDを他のプロセスに通知するには、共有メモリを確立した後、子プロセスを派生させるか、ファイルまたはパイプを書き込みます。


intサイズ(バイト単位)



sizeは、確立される共有メモリの長さです。すべてのメモリ割り当て操作はページ単位です。したがって、プロセスが1バイトのみのメモリを要求する場合、メモリはページ全体も割り当てます(i386マシンのページのデフォルトサイズPACE_SIZE = 4096バイト)。このように、新しく作成された共有メモリのサイズは、実際にはsizeパラメータから調整されたページサイズです。つまり、サイズが1〜4096の場合、適用される実際の共有メモリサイズは4K(1ページ)4097〜8192、適用される実際の共有メモリサイズは8K(2ページ)というようになります。


int shmflg

shmflgは主にいくつかの兆候に関連しています。その中で、IPC_CREATとIPC_EXCLが有効であり、それらの関数はopen()のO_CREATとO_EXCLと同等です。
IPC_CREAT共有メモリが存在しない場合は、共有メモリを作成します。それ以外の場合は、操作を開きます。
IPC_EXCL共有メモリが存在しない場合にのみ、新しい共有メモリが確立されます。存在しない場合、エラーが発生します。



IPC_CREATを単独で使用する場合、shmget()関数は、既存の共有メモリ演算子または新しい共有メモリ識別子を返します。

IPC_CREATフラグとIPC_EXCLフラグが一緒に使用されている場合、共有メモリがすでに存在する場合、shmget()は新しく作成された共有メモリ識別子を返すか、-1が返されます。

IPC_EXELロゴ自体はあまり意味がありませんが、IPC_CREATロゴと一緒に使用して、既存のオブジェクトを開くのではなく、結果のオブジェクトが新しいことを確認できます。

ユーザーの読み取りおよび書き込み権限にSHM_RおよびSHM_Wを指定します

(SHM_R> 3)と(SHM_W> 3)は読み取りと書き込みのアクセス許可のセットであり、(SHM_R> 6)と(SHM_W> 6)はグローバルな読み取りと書き込みのアクセス許可です。

これを使用することをお勧めします:

0666 | IPC_CREATはshmflgの値として使用できます。


戻り値

共有メモリ識別子を正常に返し、失敗した場合は-1を返します。errnoはエラーの原因を格納します。
EINVALパラメーターのサイズがSHMMINより小さいか、SHMMAXより大きい。
EEXISTは、事前に作成されたキーのためにメモリを共有しましたが、すでに存在しています。
EIDRMのパラメータキーによる共有メモリを削除しました。
ENOSPCが、システムで許可されている共有メモリの最大値(SHMALL)を超えています。
パラメータキーが参照するENOENT共有メモリが存在せず、パラメータshmflgにIPC_CREATビットが設定されていません。
EACCESには権限がありません。
ENOMEMのコアメモリが不足しています。


struct shmid_ds

shmid_dsデータ構造は、新しい共有メモリをそれぞれ表します。 shmget()が新しい共有メモリを作成すると、共有メモリのshmid_dsデータ構造を参照するために使用できる識別子が返されます。

include / linux / shm.h

struct shmid_ds { struct ipc_perm shm_perm /* operation perms */ int shm_segsz /* size of segment (bytes) */ __kernel_time_t shm_atime /* last attach time */ __kernel_time_t shm_dtime /* last detach time */ __kernel_time_t shm_ctime /* last change time */ __kernel_ipc_pid_t shm_cpid /* pid of creator */ __kernel_ipc_pid_t shm_lpid /* pid of last operator */ unsigned short shm_nattch /* no. of current attaches */ unsigned short shm_unused /* compatibility */ void *shm_unused2 /* ditto - used by DIPC */ void *shm_unused3 /* unused */ }


struct ipc_perm

システムは、IPCオブジェクトごとに、struct ipc_permデータ構造を共有して、IPC操作がIPCオブジェクトにアクセスできるかどうかを判断するためのアクセス許可情報を格納します。

struct ipc_perm { __kernel_key_t key __kernel_uid_t uid __kernel_gid_t gid __kernel_uid_t cuid __kernel_gid_t cgid __kernel_mode_t mode unsigned short seq }


void * shmat(int shmid、const void * addr、int flag)
shmid:共有ストレージID
addr:通常0は、カーネルによって選択された最初の使用可能なアドレスに接続することを意味します。それ以外の場合、フラグがSHM_RNDを指定しない場合は、addrで指定されたアドレスに接続します。フラグがSHM_RNDの場合、アドレスは丸められます。
フラグ:前述のように、通常は0 //推奨値です。
戻り値:成功した場合は共有ストレージセグメントアドレスを返し、エラーの場合は-1を返します


int shmdt(void * addr)
addr:共有ストレージセグメントのアドレス、shmatが以前に呼び出されたときの戻り値
shmdtは、関連するshmid_ds構造体のshm_nattchカウンター値を1つデクリメントします。


int shmctl(int shmid、int cmd、struct shmid_ds * buf)
shmid:共有ストレージセグメントのID
cmd:いくつかのコマンドは次のとおりです:IPC_STAT、IPC_RMID、SHM_LOCK、SHM_UNLOCK

共有メモリは、プログラムの終了時に自動的に削除されないことに注意してください。shmctlを呼び出して削除するか、コマンドを手動で削除してください。そうしないと、共有メモリはシステムに永久に残ります。

詳細リファレンス:「Linux共有メモリの表示と削除」 https://blog.csdn.net/whatday/article/details/104092750