Linux C バックグラウンドサービスプログラムの単一プロセス制御の実装

Linux C バックグラウンドサービスプログラムの単一プロセス制御の実装

導入

通常、バックグラウンド サーバー プログラムには 1 つのプロセスのみが必要ですが、単一のプロセスを作成するにはどうすればよいでしょうか?

この例では、flock 関数を使用して pid ファイル /var/run/myserver.pid をロックします。

  • ロックが異常な場合は、バックグラウンド サービス プロセスがすでに実行されていることを意味し、エラーが報告され、システムが終了します。
  • ロックが成功した場合、バックグラウンドサービスプロセスが実行されていないことを意味し、プロセスは正常に有効化できます。

バックグラウンドサービスプログラム単一プロセス制御

詳細には触れずに、コードを直接見てみましょう

#include <stdio.h>
#include <stdlib.h>
#include <文字列.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>

#PID_BUF_LEN を定義する (20)
# RUN_PID_FILE を "/var/run/myserver.pid" と定義します

//サービス プロセスの単一インスタンスが実行中 //戻り値: 1 - 実行中、0 - 実行されていない、-1 - エラー int server_is_running()
{
  int fd = open(RUN_PID_FILE, O_WRONLY|O_CREAT);
  もし(fd < 0)
  {
    printf("open run pid err(%d)! %s\n", errno, RUN_PID_FILE);
    -1 を返します。
  }
   
  // ロック // LOCK_SH は共有ロックを確立します。複数のプロセスが同時に同じファイルのロックを共有できます。
  // LOCK_EX は相互排他ロックを確立します。一度にファイルに対して設定できる排他ロックは 1 つだけです。
  (flock(fd, LOCK_EX|LOCK_NB) == -1 の場合)
  {
    //ロックを追加できない場合、サービスは実行中であり、ロックされています printf("サーバーは現在実行中です! errno=%d\n", errno);
    閉じる(fd);
    1 を返します。
  }

  // ロックが成功し、サービスが実行されていないことが証明されました // ファイル ハンドルを閉じたりロック解除したりしないでください // プロセスは終了し、自動的にロック解除されます printf("myserver は実行されていません。実行を開始します..... pid=%ld\n", (long)getpid());

  char pid_buf[PID_BUF_LEN] = {0};
  snprintf(pid_buf, sizeof(pid_buf)-1, "%ld\n", (long)getpid());

  // プロセス pid を /var/run/myserver.pid ファイルに書き込みます。write(fd, pid_buf, strlen(pid_buf));

  0を返します。
}

int メイン(void)
{

  //単一インスタンスの実行検出を処理する if(0 != server_is_running())
  {
    printf("myserver プロセスが実行中です!!!!! 現在のプロセスは終了します!\n");
    -1 を返します。
  }

  ながら(1)
  {
    printf("myserver が実行中...\n");
    睡眠(2);
  }

  0を返します。
}

運用結果

プログラムを実行すると、プロセスPIDが6965であることがわかります。

[root@lincoding シングルプロセス]# ./myserver 
サーバーが稼働していません。稼働を開始してください.....pid=6965
myserver が実行しています... 
myserver が実行しています... 
myserver が実行しています... 
myserver が実行しています... 
myserver が実行しています... 
myserver が実行しています... 
myserver が実行しています... 
myserver が実行しています...

/var/run/myserver.pid には、このプロセスの pid 番号も記録されます。ps auxf | grep myserver は、myserver プロセスが実行中であることを示します。

[root@lincoding singleprocess]# cat /var/run/myserver.pid 
6965
[root@lincoding シングルプロセス]# 
[root@lincoding シングルプロセス]# ps auxf | grep myserver
ルート 6965 0.0 0.0 3924 460 ポイント/0 S+ 00:32 0:00 | \_ ./myserver
ルート 9976 0.0 0.0 103256 856 ポイント/1 S+ 00:35 0:00 \_ grep myserver
[root@lincoding シングルプロセス]# 

この時点で、myserverプログラムを再度実行すると、myserverプログラムがすでに実行されており、別のプロセスを開始できないことが検出されるため、エラーが報告されて終了します。これにより、バックグラウンドサービスプログラムの単一プロセス制御が実現されます。

[root@lincoding シングルプロセス]# ./myserver 
サーバーは現在実行中です! errno=11
myserver プロセスが実行中です!!!!! 現在のプロセスは終了します!

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linux プロセス制御の詳細な説明と例
  • Linux でプロセスを制御するコマンドの概要

<<:  Vue-pdfはPDFファイルのオンラインプレビューを実装します

>>:  TypeScript でオブジェクト キーの値の範囲を制限する方法

推薦する

HTML テーブルタグチュートリアル (33): セルの垂直配置属性 VALIGN

垂直方向では、セルの配置を上、中央、下に設定できます。基本的な構文<TD VLIGN=&quo...

Reactでコンポーネントがどのように通信するかの詳細な説明

1. 何ですかコンポーネント間の通信は、次の 2 つの単語に分けることができます。コンポーネントコ...

HTML チュートリアル、optgroup 要素の理解

カテゴリ選択を選択します。テストの結果、IE と FF はこの要素を適切にサポートできることがわかり...

JavaScript でオブザーバー パターンを実装する方法

目次概要オブザーバーパターンの応用シナリオオブザーバーパターンの実装要約する概要オブザーバー パター...

docker compose の記述ルールについての簡単な説明

この記事ではクラスタの展開に関連する内容は紹介しませんバージョン制約Docker エンジン >...

MySQL 8.0.11 インストール概要チュートリアル図

インストール環境: CAT /etc/os-release CentOS システムのバージョン情報を...

MySQL自動シャットダウン問題への対処の実践記録

最近、あるプロジェクトを手伝ったのですが、MySQL マシンがしばらくすると自動的に停止し続けました...

表内のコンテンツオーバーフローのレイアウト方法について

コンテンツオーバーフローとは何ですか?実際、テキストが大量にある場合、コンテンツ領域がそれだけの長さ...

検索テキストボックスがフォーカスを外れたときにテキストの位置がジャンプする問題の解決方法

検索テキストボックスにテキストを設定すると、フォーカスを外すと位置がジャンプしますコードをコピーコー...

MySql への新しいユーザーの追加、ユーザー用のデータベースの作成、ユーザーへの権限の割り当ての概要

1. 新しいユーザーを追加するローカルIPアクセスのみを許可する '123456' ...

JPG、GIF、PNGなどのさまざまな画像形式の詳細な説明

ウェブページ上の画像が一般的に jpg、gif、png 形式であることは誰もが知っています。それらの...

ウェブフロントエンドエンジニアにおすすめのヒント

まず、Webフロントエンドエンジニアの価値についてお話ししましょう。現在、Web製品のインタラクショ...

Vue でコンポーネントを一括インポート、登録、使用する方法

序文コンポーネントは、非常に頻繁に使用されるものです。多くの人は、コンポーネントを 1 つのファイル...

30 種類の無料の高品質英語リボンフォント

30 種類の高品質な英語リボン フォントを無料でダウンロードできます。デザイナーは常に、25 種類の...

jsで照明スイッチを制御する

参考までに、jsを使用して照明スイッチを制御します。具体的な内容は次のとおりです。トピック: js ...