0

procA問題: 2 つのプロセス間の同期に SysV セマフォを使用する方法 (それらを と と呼びましょうprocB)、両方がシェルから独立して実行され (いずれもfork/のexec組み合わせによって生成されない)、セマフォがいずれかによって作成される必要があると仮定します。この2つのプロセス。

引用man semget

新しく作成されたセット内のセマフォの値は不確定です。(POSIX.1-2001 はこの点について明示的です。) Linux は、他の多くの実装と同様に、セマフォ値を 0 に初期化しますが、移植可能なアプリケーションはこれに依存できません。セマフォを目的の値に明示的に初期化する必要があります。

POSIX 保証のみに依存し、Linux 固有の保証には依存しない移植可能なコードを書きたいとします。そのため、セマフォ セットをアトミックに作成して初期化することは不可能です。これは、2 つの別々の呼び出しで行う必要があります。

したがって、セマフォ セットを作成するコードは次のprocAようになります。

int sem_id = semget(key, nsems, IPC_CREAT | S_IRWXU);

同様に、procBこのように、初めてセマフォを必要とするプロセスが発生した場合でも、セマフォを作成します。それ以外の場合は、セマフォ セットの ID を取得するだけで、すぐに使用できます。

初期化が必要になると、問題が発生し始めます。初期化の指示はもちろん– ですがsemctlSETALL• 初期化は 1 回だけ行うべきであり、 • 初期化はセマフォを使用する前に行う必要があります。これはもちろん… セマフォによって強制できますが、そのような解決策は残念ながら再帰的です。

sysV セマフォのみを使用してこれを行うことは可能ですか? または、これらのセマフォを確実にセットアップできるようにするには、シグナルやメッセージ キューなどの他の IPC 機能に頼る必要があると思いますか?

4

1 に答える 1