0

システムにログインするための API があります。同じユーザー ID での同時ログインはサポートされていません (ライセンスによると思います)。ただし、このコードは、別のシステム (私の場合は ClearCase トリガー) から別のユーザーによって起動された別のプロセス/クライアントから呼び出すことができます。

my $conn = new BuildForge::Services::Connection('ccbuildforged01', 3966);
my $token = $conn->authUser('bldforge', 'password');

私には2つの選択肢があります。

  1. 返された $token は、異なるクライアントで共有できます。では、この $token を永続化するにはどうすればよいでしょうか?
  2. 私は 10 個のライセンスを持っているので、10 人のユーザーを作成できます。すべてのクライアントがこれらのユーザー ID を共有するために、ファイル ベースの永続的なスタックを作成するにはどうすればよいですか?

少しグーグルで検索したところ、これが見つかりました。必要なのは、単一の単純なファイルとロックだけです。ロック、追加、ロック解除でプッシュします。ロック、シーク、読み取り、切り捨て、ロック解除でポップします。

誰かがコードサンプルをくれますか?

4

2 に答える 2

1

ユーザー情報を含む 10 個のファイル (たとえば 1.conf から 10.conf) を維持します。

使用可能なユーザー ID を取得するには、対応する .pid ファイル (1.pid など) のない .conf ファイルを探します。見つかった場合は、ファイルの排他ロックを取得してから、排他ロックを使用して対応する .pid ファイルを作成してください。(これらのいずれかが失敗した場合は、別のファイルを探してください。)

完了したら、.conf ファイルのロックを解除してから、ロックを解除して .pid ファイルを削除します。

競合状態の可能性を回避したい場合は、使用可能なユーザー ID を探す前に排他的にロックしようとする queue.lock ファイルを用意することができます。すでにロックされている場合は、ロックが解除されるまで待ちます。

于 2012-12-21T23:08:09.093 に答える
0
  1. なぜ追加の .pid ファイルが必要なのですか? .conf ファイルをロックするだけでは十分ではありませんか?
  2. 次のコードを使用して、このプログラムの 2 つのインスタンスを同時に開始すると、2 番目のインスタンスは 1 番目のインスタンスがロック解除されるのを待ってから、最初のファイル id01.txt をロックします。読むのを待っています。ファイルがロックされている場合、次のファイルに移動するにはどうすればよいですか?

    FileHandle を使用します。Fcntl qw(:flock) を使用します。

    for ($count = 1; $count <= 8; $count++) {
    if (open SELF, "< id0$count.txt"); if (flock(SELF, LOCK_EX)) { # 排他ロック print "Locked id0$count.txt...\n"; 睡眠 (10); SELFを閉じます。} そうでなければ { 次へ }

    } そうでなければ{次; print "ロック解除された id0$count.txt...\n"; }

于 2012-12-31T16:39:28.087 に答える