導入 通常、バックグラウンド サーバー プログラムには 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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Vue-pdfはPDFファイルのオンラインプレビューを実装します
>>: TypeScript でオブジェクト キーの値の範囲を制限する方法
序文この記事では、Windows 10 システムで MySQL を完全に削除してアンインストールする...
みなさんこんにちは。私は技術の話ばかりして髪を切らない先生のトニーです。今回はMySQL 8.0で追...
コマンドライン mysqld –skip-grant-tables は mysql8 では正常に起動...
1. サーバー ホストをクリックし、右側の操作リストで [仮想スイッチ管理] をクリックして、仮想...
誰もが色にとても敏感だと思います。私たちの目が見るところにはどこにでも色があります。では、CSS で...
ルーティングvue-router4 では API の大部分は変更されていないため、変更点のみに焦点を...
以前、開発で頻繁に pip ダウンロードを使用する必要がありました。pip ソースを国産ソースに変更...
MySQL データベースを使用すると、他のユーザーが定義したストアド プロシージャを他のユーザーが変...
これは、面接者の CSS に関する基本的な知識をテストするものです。 CSSでアニメーションを実装す...
<br />ウェブサイトのアクセス速度はウェブサイトのトラフィックに直接影響を及ぼし、ウ...
Raspberry Pi 3B に 64 ビット アプリケーション (64 ビット JDK など) ...
MySQL 8.0 の新機能は次のとおりです。 Unicode 9.0 をすぐに完全にサポートウィン...
nginx をインストールApple Mac ではインストールに brew を使用します。brew ...
目次Dockerコンテナのデータ量データボリュームの使用方法1: コマンド-vを使用して直接マウント...
n 個のアイテムがあり、これらのアイテムをグリッド レイアウトの列に並べ替える必要があるとします。列...