10

ユーザーがアプリケーションの複数のインスタンスを実行できないようにしたいと考えています。私の疑似コードは次のようになります。

sem_t one_instance_only=sem_open(UNIQUE_NAME,O_CREAT | O_EXCL,...);
if(SEM_FAILED==one_instance_only)
{
    if(E_EXIST==errno)
    {
    // application already running
    exit(1);
    }
}
sem_close(...);
//without the call to sem_unlink() the semaphore still lingering even if app not 
// running
sem_unlink(...);     

私はそれを試してみましたが、うまくいきましたが、私はそれを正しくやっていて、どこかに問題がないことを確認したいだけです.

4

3 に答える 3

2

実際にはセマフォ機能を使用していません。通常のファイルでも同じ効果が得られます。O_CREAT|O_EXCL で open を使用し、終了時にリンクを解除します。
同じファイルを使用して PID を書き込むことができます (「pidfile」)。open が失敗した場合は、PID を読み取り、それを使用して、プログラムの別のインスタンスに属しているかどうかを確認します。クラッシュに。

于 2013-01-30T23:15:19.177 に答える
1

問題は、ロジックがアプリケーションのインスタンスが実行されるという確固たる保証を提供できないことです。既存のアプリケーションがすでに終了することを決定し、終了パスを実行しているが、まだ呼び出していない場合はどうなりsem_closeますか?新しいインスタンスは、セマフォがまだそこにあるため「私は不要」と考えて終了します。最終的な結果は、何も実行されていないということです。

これが問題であるかどうかは、状況によって異なります。インタラクティブなアプリであれば、このようなことをやめることができます。PCユーザーは、ものが起動しないときにアイコンを複数回クリックすることに慣れています。

この問題を解決する1つの方法は、IPCメカニズムを使用することです。たとえば、サーバーの新しいインスタンスは既存のインスタンスに接続して、「可能であれば実行を継続してください」というリクエストを送信できます。サーバーに接続できない場合、または要求への応答が否定的な場合は、サーバーが新しいインスタンスとして引き継ぐことができます。

既存のインスタンスにリクエストを渡す必要がある場合にも、これが必要です。プログラムにコマンドライン引数があり、何らかのアクションを実行する必要があるとします。または、おなじみの例を次に示します。ブラウザについて考えてみます。ユーザーはOSにURLを開かせたいので、既存のブラウザインスタンスを使用します。新しいブラウザを起動しない場合は、そのURLをリクエストとして既存のインスタンスに伝達する必要があります。起動リクエストは、誰かまたは何かがプログラムに何かを実行させたいという理由で行われたイベントであるため、既存のインスタンスが存在することを確認して終了するだけでは不十分です。使用しているロジックは、構成を読み取ってから要求をリッスンするデーモンタイプのプロセスにのみ適しています。このプロセスの起動は何のトリガーにもなりません。

于 2013-01-31T04:53:07.870 に答える