2

以下は、完了までに 10 秒かかる単純な「hello world」C プログラムです。

#include<stdio.h>
main()
{
    printf("hello World 1 \n");
    fflush(stdout);
    sleep(10);
    printf("hello World 2 \n");
    fflush(stdout);
}

この実行可能ファイルの最大 1 つのインスタンスのみがいつでも実行できるように変更するにはどうすればよいですか? 私はLinuxを使用しています。

たとえば、複数のインスタンスが同時に実行されるとサーバーがクラッシュし、これを防止しようとしているとします。システムで実行して検証できるように、さまざまな方法の例を 1 つ以上見たいと思います。

また、それらをキューに入れる簡単な方法があるので、C 実行可能ファイルを 2 回続けて実行すると、最初の実行が完了した直後に 2 番目の実行が実行されますか?

4

2 に答える 2

5

通常、ファイル ロックを取得し、初期化時にコンテンツとしてプロセス PID を使用して、特定のファイル名のランタイム ファイルを作成します (UNIX システムでは、通常は/var/run/)。終了時にファイルを削除します。

起動時にファイルがすでに存在する場合は、別のインスタンスがすでに実行されています。

于 2012-04-17T23:33:03.053 に答える
0

C プログラムhello.cに という名前を付け、 を使用してコンパイルするとしますgcc -g hello.c -o hello.exe。実行可能ファイルを直接実行する代わりに、bash スクリプトを作成して実行します。bash スクリプトは、C プログラムが実行中であることを示すダミー ロック ファイルが存在するかどうかをチェックします。このロック ファイルが存在しない場合は、この bash スクリプトへの今後の呼び出しで C プログラムが実行中であることを認識できるように、ロック ファイルが作成されます。bash スクリプトは次のとおりです。

#!/bin/sh
if [ ! -f dummy.file ];
then
    echo "File not found. Let's create one now, then run hello.exe."
    echo 'locked'> dummy.file
    ./hello.exe
else
    echo "File dummy.file exists, so hello.exe is not run."
fi

次のように、プログラムの最後にあるファイルを削除するために、上記の C プログラムにコードを追加する必要があります。

#include<stdio.h>
main()
{
    printf("hello World 1 \n");
    fflush(stdout);
    sleep(10);
    printf("hello World 2 \n");
    fflush(stdout);

    if (remove("dummy.file") == -1)
      perror("Error in deleting lock file");
 }

とてもシンプルです。この解決策を示唆してくれた skjaidev に感謝します (これについては、答えとしてクレジットを与えます)。

于 2012-04-18T00:30:40.553 に答える