C または C での単一インスタンス アプリケーションの作成
ソフトウェア開発の領域では、アプリケーションの実行を制限することが望ましい場合がよくあります。単一のインスタンスに接続し、常に 1 つのプロセスのみが実行できるようにします。これを実現するには、主にファイル ロック、ミューテックス、その他の同期メカニズムを中心としたさまざまな手法を使用できます。
ファイル ロック
1 つのアプローチは、ファイル ロックを使用することです。以下のコード スニペットに示すように:
<code class="c">#include <sys/file.h> #include <errno.h> int pid_file = open("/var/run/whatever.pid", O_CREAT | O_RDWR, 0666); int rc = flock(pid_file, LOCK_EX | LOCK_NB); if(rc) { if(EWOULDBLOCK == errno) ; // another instance is running } else { // this is the first instance }</code>
ここでは、open() を使用して anything.pid という名前のファイルを作成し、そのファイル記述子を取得します。一方、flock() は排他ロックの取得を試みます。ファイルの書き込みロックを保持できるインスタンスは一度に 1 つだけです。
ミューテックスベースのアプローチ
もう 1 つのオプションには、より柔軟なロックを提供するミューテックスの利用が含まれます。マルチスレッド環境内のメカニズム:
<code class="c">#include <pthread.h> pthread_mutex_t mutex; pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutex_init(&mutex, &attr); pthread_mutex_lock(&mutex); // critical section code pthread_mutex_unlock(&mutex);</code>
ここで、pthread_mutex_init() は attr で指定された属性を使用してミューテックスを初期化し、pthread_mutex_lock() と pthread_mutex_unlock() はそれぞれロック操作とロック解除操作を実行して、クリティカル セクションを実行できるのは 1 つのスレッドだけです。
Unix ドメイン ソケット
より高度なテクニックには、事前定義されたソケット名を使用して Unix ドメイン ソケットを作成してバインドすることが含まれます。
<code class="c">#include <sys/socket.h> int sockfd = socket(AF_UNIX, SOCK_STREAM, 0); int rc = bind(sockfd, (struct sockaddr*)&unixaddr, sizeof(unixaddr)); if(rc) { if(errno == EADDRINUSE) ; // another instance is running } else { // this is the first instance }</code>
ここで、socket() は新しいソケットを作成し、bind() はそれを unixaddr に格納されているソケット名にバインドしようとします。バインド操作が EADDRINUSE で失敗した場合は、アプリケーションの別のインスタンスがすでに実行されていることを示します。
どのアプローチを使用するかの選択は、アプリケーションの特定の要件と、必要な信頼性とパフォーマンスのレベルによって異なります。ファイル ロックは直接的で実装が簡単なソリューションを提供し、ミューテックスはマルチスレッド環境での柔軟性を高め、UNIX ドメイン ソケットは古いプロセス情報を処理できるより回復力のあるアプローチを提供します。
以上がC/C アプリケーションの複数のインスタンスが実行されないようにする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。