2016-07-21 51 views
1

「セマフォへのオープン参照がない」場合セマフォ名が削除されます(*)は、sem_unlink()はセマフォ

  • 1)どのようなこれらの「参照」はあるの名前を削除します?
  • 2)関連するプロセスを特定するためにこれらのリファレンスを照会できますか?

同じ節では、「セマフォへのオープンな参照がない場合、破壊されます。さもなければ、破棄は最後に開いた参照が閉じられるまで延期されます。 これは、OSがセマフォを破壊することができるまで、これらの参照をクエリし続けることを意味します。 これらの「参照」はセマフォの値よりも多くありますか?

(*)W.R。 Stevens、S.A. Rago「UNIX環境における高度なプログラミング」、第3版、p。 581.

答えて

0

「これらの参照は何ですか?

名前付きセマフォは、形式が/somenameの名前で識別されます。その は、最大終端文字がNAME_MAX -4(すなわち、251) のヌル終端文字列で、最初のスラッシュとそれに続く1つ以上のスラッシュで構成された 文字で構成されます。 sem_open(3)に同じ名前を渡すことによって、同じ名前のセマフォーを持つ2つのプロセスが で動作することができます。

ティは、基本的に基づいて(十分な権限を持っている場合(sem_open(3)に渡さO_CREATフラグ)(/somenameの形で)という名前のセマフォを作成するプロセスが別のプロセスがセマフォ名前その上で動作することが可能になることを意味しそのセマフォを作成するプロセスuid/gidmodesem_open(3)に渡されます)。

は、2つ以上の異なるプロセスで同じセマフォーを識別して操作するための簡単な方法です(同じファイルを開く2つのプロセスに似ています)。

"関連するプロセスを特定するためにこれらの参照をクエリできますか?"

いいえ(少なくとも、POSIXの方法で)。

"これは、OSがセマフォを破壊するまでこれらの参照を引き続きクエリすることを意味します。

これは実装固有のものですが、OSがセマフォを照会し続ける必要がなく、セマフォがリンク解除可能かどうかを判断する必要はありません。簡単な参照カウンタとして参照してください。Process#3によってsem_unlink()が呼び出され、まだProcess#2Process#1がまだそのセマフォを使用している場合、その参照カウンタはこの時点で2になります。 sem_close()またはsem_unlink()コールごとに参照カウンタの値を評価して、0に達した時点を判断し、名前付きセマフォを効果的にリンク解除するだけで済みます。

+0

ご返信ありがとうございます。 プロセスが順序外のsem_post()を実行すると、保留中のプロセスが誤って実行される可能性がありますか? – ovi

+0

@oviアーキテクチャレベルの実装について心配する必要はありません。 POSIX [定義された振る舞い]仕様に従うならば、すべてが期待通りに動作しなければなりません。 – pah

+0

私の質問は、私のアプリケーションが直面している実際の状況の結果です。ユーザーが誘導する非同期イベントは、壊れた待機ポストを引き起こします。これをクリーンアップしようとすると、外部プロセスは無条件にセマフォのリンクを解除して削除する方法が必要です。私は(恣意的に)10回の呼び出しを '投稿'に入れてリンクを解除するクリーンアッププロセスを実装しようとしました。それは機能しているようです。私はちょうど私のソリューションが、brute力が有効である/法的であることを確認したい。 – ovi

関連する問題