プログラミングインタフェース

IPC インタフェース、キー引数、および作成フラグ

IPC 機能へのアクセスを要求するプロセスは、その機能を識別する必要があります。アクセス権を要求する IPC 機能をプロセスが識別できるようにするために、IPC 機能へのアクセスを初期化または提供するインタフェースは key_t というキー引数を使用します。キーは、任意の値または実行時に共通の元になる値から導き出すことができる値です。このようなキーは、ftok(3C) を使用して、ファイル名をシステム内で一意のキー値に変換することで導くこともできます。

メッセージ、セマフォー、または共有メモリーへのアクセスを初期化または取得するインタフェースは int 型の ID 番号を返します。IPC インタフェースの読み取り、書き込み、および制御操作を行う関数は、この ID を使用します。

キー引数に IPC_PRIVATE を指定して関数を呼び出すと、作成プロセス専用の IPC 機能のインスタンスが新しく初期化されます。

呼び出しに適切なフラグ引数として IPC_CREAT フラグを指定した場合、IPC 機能が存在していなければ、インタフェースはその IPC 機能を新たに作成しようとします。

IPC_CREATIPC_EXCL の両方のフラグを指定してインタフェースを呼び出した場合、IPC がすでに存在していれば、インタフェースは失敗します。この動作は複数のプロセスが IPC 機能を初期化する可能性がある場合に便利です。たとえば、複数のサーバプロセスが同じ IPC 機能にアクセスしようとする場合です。サーバープロセスがすべて IPC_EXCL を指定して IPC 機能を作成しようとすると、最初のプロセスだけが成功します。

IPC_CREAT と IPC_EXCL の 2 つのフラグをどちらも指定しない場合、IPC 機能がすでに存在していれば、インタフェースはその機能の ID を返して、アクセスを取得できるようにします。IPC_CREAT を指定しなし場合、該当する機能がまだ初期化されていなければ、呼び出しは失敗します。

論理 (ビット単位) OR を使用すると、IPC_CREATIPC_EXCL を 8 進数のアクセス権モードと組み合わせることによってフラグ引数を作成できます。たとえば、次の例では、メッセージ待ち行列が存在していない場合は新しい待ち行列を初期化します。

msqid = msgget(ftok("/tmp", 'A'), (IPC_CREAT | IPC_EXCL | 0400)); 

最初の引数は、文字列「"/tmp"」に基づいてキー「'A'」と評価されます。2 番目の引数は、アクセス権と制御フラグが組み合わされたものと評価されます。