2

プロセスによってセマフォが作成されると、どのプロセス/ユーザーからもアクセスできるようになると想定しています。

特定のセマフォにアクセス制限を設定して、特定のプロセス/ユーザーのみがアクセスできるようにしたり、特定のプロセスのみがセマフォを解放できるようにすることは可能ですか?
すべてのプロセスがセマフォにアクセスできるようにすると、いくつかの問題が発生します。例: ダミー プロセスがセマフォを読み取ってロックを解放し、実際にセマフォ ロックを待機している実際のプロセスに誤ったシグナルを送信することができます。

次のコードスニペットで非常に奇妙な出力が得られるため、これらすべての質問が発生しています。

use Win32::Semaphore; 

$sem = Win32::Semaphore->new(0, 1,"reliance2692") 
    or print "Can't create semaphore\n";

$sem = Win32::Semaphore->open("reliance2692") 
    or print "Can't open semaphore\n";

print "Semaphore:" . $sem . "\n";

上記のプログラムを実行すると、次の出力が得られます

セマフォを作成できません
セマフォをオープンできません

出力は、セマフォの作成に失敗し、セマフォを開くことさえできなかったことを示しています。指定された名前のセマフォが既に存在する場合、セマフォの作成に失敗する可能性があります。セマフォのオープンに失敗した理由がわかりません。

セマフォの作成とセマフォを開くの両方が失敗するシナリオを明確にすることができます。

4

3 に答える 3

3

Win32::Semaphore->newWindows API 関数CreateSemaphoreを呼び出し、プロセスの既定のセキュリティ記述子を取得します。これは、通常、スクリプトと同じユーザーとして実行されているプロセスは完全なアクセス権を持つことができますが、他のアカウントとして実行されているプロセスにはアクセス権がないことを意味します。したがって、まず第一に、あなたの仮定は誤りです。

Perl コードで選択した名前は API 関数に直接渡されるため、他のすべての Win32 カーネル オブジェクトと同じ名前空間規則に従います。

Win32::Semaphore は、アクセス制限を指定するためのインターフェイスを提供しません。あったとしても、Windows はプロセスごとのアクセス許可を提供しません。権限は、プロセスではなくユーザーに付与されます。

から「アクセスが拒否されました」というメッセージが表示される場合はnew、別のプログラムが実行されていて、同じ名前を別のもの (おそらく別のセマフォ、またはイベントやミューテックスなど) に使用することを選択したことを示しています。そのプロセスは実行されています。別のユーザーとして。

から「アクセスが拒否されました」というメッセージが表示される場合はopen、 の可能性に加えて、new別のプロセスが同じ名前のセマフォをすでに開いているが、他のユーザーに完全なアクセス許可を付与していない可能性があります。許可をWin32::Semaphore->open要求します。SEMAPHORE_ALL_ACCESS

セマフォが、同じユーザーとして実行中のプロセスによってすでに開かれている場合、「アクセスが拒否されました」と表示されることはありません。とにかく183 ( ) を保持する可能性がありますが、その場合も失敗することはありnewません。open$^EERROR_ALREADY_EXISTS

于 2009-09-21T21:27:47.193 に答える
2

ちなみに、私はWin32::Semaphoreの作者です。mobruleとRobが説明したように、Windowsのセキュリティはユーザー/グループベースです。特定のプロセスのみがアクセスできるセマフォを持つことはできません。ユーザーに属するプロセスがセマフォにアクセスできる場合、そのユーザープロセスはそのセマフォにアクセスできます。

通常、デフォルトのアクセスでは、現在のユーザーのみがセマフォにアクセスできます。Win32 :: Semaphoreにデフォルト以外のセキュリティ記述子を指定させる機能を要求した人は誰もいません。また、関連するAPIは重要です。誰かがSECURITY_ATTRIBUTES構造を管理するモジュールを作成した場合、Win32::Semaphoreおよび関連するIPCモジュールにそのサポートを追加できれば幸いです。 Win32-セキュリティはそのモジュールではないようですが、それは始まりかもしれません。

複数のユーザー間で機能するセマフォが必要な場合、現時点での唯一の解決策は、Win32 :: Semaphoreの外部でセマフォを作成し、適切なSECURITY_ATTRIBUTESポインターを渡すことです。これは、Cで記述された小さなヘルパープログラムを使用するか、Inline::Cを使用して行うことができます。(一度作成されたセマフォは、プロセスが開いている限り存在するため、ヘルパープログラムは、呼び出すまでセマフォハンドルを開いたままにしておく必要がありますWin32::Semaphore->open。)

于 2009-09-22T06:35:09.533 に答える
1

Win32::Semaphoreポッドから

$semaphore = Win32::Semaphore->new($initial, $maximum, [$name])

新しいセマフォ オブジェクトのコンストラクタ。$initial は初期カウントで、$maximum はセマフォの最大カウントです。$name が省略された場合、または undef の場合、名前のないセマフォ オブジェクトが作成されます。

$name が既存のセマフォ オブジェクトを示す場合、$initial と $maximum は無視され、オブジェクトが開かれます。この場合、$^Eは 183 ( ERROR_ALREADY_EXISTS) に設定されます。

私がこれを正しく読んでいる場合、呼び出しがWin32::Semaphore->new既存のセマフォを参照している場合、そのnew呼び出しはセマフォも開き、後続のopen呼び出しは冗長になります (開いた場合に何が起こるかはポッドから私にはわかりません既に開いているセンパホール)。

おそらく、コードをステップ実行して、各ステップで$semとの値をチェックすることができます。$!$^E

追加の回答: Windows APIにはセマフォのアクセス制御を設定するメソッドがありますが、

  1. Win32::Semaphoreそれらは Perlモジュールで公開されていないようです
  2. セマフォを作成した他のプロセスによって許可されていない限り、アクセス制御を設定することはできません

この問題に対する適切なオプションがあるかどうかはわかりません。アクセス制限を緩和するために、セマフォを作成するプロセスを変更できますか? Win32::Semaphore作成者にモジュールの更新を依頼しますか? Win32::Semaphore自分を直してみる?

于 2009-09-21T20:00:25.313 に答える