1

他のいくつかのプロセスの起動を制御するスーパーバイザー プロセスを C で作成し、すべてのプロセス (以前はそれ自体で開始されたもの) を監視し、プロセスのいずれかが終了した場合などのエラーに対処します。すべての I/O エラーを管理します。そのプロセスを再起動し、同じコンテキストで、また終了ポイントからそのプロセスを再起動します。終了の背後にあるエラーを解決しようとする場合もあります。
私はたくさん検索しましたが、良いものは何も見つかりませんでした。Erlang にはスーパーバイザー コントロールがあることがわかりました。私はCで同じことをしたい.私はこれを行う2つの方法を考えています(プロセスの終了に注意してください):

  1. シグナルの使用: さらに、次の 2 つの方法があります。

    a) スーパーバイザからのポーリング プロトコルを使用し、プロセスが正常かどうかを定期的にチェックする。
    b) 非スーパーバイザ プロセスのすべてのシグナルを処理し、キラー シグナルが発生した場合はスーパーバイザに通知します。

  2. Use Process Accounting: Stevens で定義されているように - (pg250)プロセスが終了するたびに、アカウンティング ファイルにレコードが書き込まれます。スーパーバイザーをこの会計ファイル駆動型にすることができます。変更が発生するたびに、プロセスの 1 つが終了して処理されているかどうかを確認します。

私が欲しいのは、このスーパーバイザー プロセスに関する情報がネット上にほとんどないためです。

4

2 に答える 2

1

私があなたのことを正しく理解していれば、あなたにできることがいくつかあります。

子供の管理

シグナル

長所:

  • 簡単、自動的に非同期
  • すべての POSIX システムに組み込まれています
  • Cに組み込まれています
  • 子がシグナルのアクションの規則に従う場合、子を少し制御できるようにします ( SIGHUP: 構成の再読み込み、SIGTERM: 制御されたシャットダウン、SIGINT: 終了/無視、SIGKILL: 終了 (それに関するオプションはありません) など)。

短所:

  • 不正確
  • シグナルは、余分なデータなしで非常に基本的なアイデアのみを伝えることができます
  • シグナル配信は保証されていません
  • 信号は簡単に遅延する可能性があり、高負荷下で配信されることに本当に依存できる唯一のものはSIGKILL
  • 2 つのユーザー定義アクション シグナルのみ:SIGUSR1およびSIGUSR2

会計

長所:

  • 死亡した子に関する通知の取得は、親の受信を通じて行われるため、シグナルと同じです。SIGCHLD

短所:

  • シグナルと同じ
  • 非常に小さな制御。子がいつ終了するかを知ることができ、再起動できます。余分なデータはなく、信号を組み合わせて使用​​しない限り、制御はさらに少なくなります。

IPC (および UNIX ドメインソケット)

長所:

  • 信頼性のある
  • リッチ。IPC (おそらく完全な HTTP) を介して必要なだけ複雑なプロトコルを定義でき、生のメモリを共有することもできます。
  • 効率的
  • POSIX標準化
  • プロトコルを定義します -- スーパーバイザーが知る必要があることだけをメッセージで送信します。必要なことは何でも上司に伝えることができます。

短所:

  • 監視対象のプロセスを大幅に変更する必要がありますが、これは不可能な場合があります。
  • 独自のプロトコルを発明する必要がありますが、これは難しい場合があります。
  • より多くのコード。

子供の制限

これは単なるメモです。標準fork(またはvfork)/execを使用している場合は、リソースの子の使用を制限することもできます。疑似コードは次のとおりです。

if(fork() != 0)
{
  setrlimit(...); //Set the resource limits of the child. Look at `man 2 setrlimit`
  exec..(...);
}

setrlimitプロセスが持つことのできるウォール クロック CPU の量、メモリの量、ファイルの数などの制限を設定してみましょう。プロセスがそれを超えると、SIGXCPU.


以下に、確認する必要があるいくつかの事項を示します。

全体として、IPC を使用することをお勧めします。また、監視したいコードを変更できない場合でも、何かを行うことはできます。ステータスを取得できる場合、またはそれ以上に STDOUT および STDIN からプロセスを制御できる場合は、C stdlibpopenと、それが構築されているものである POSIX を調べてくださいpipe

于 2012-07-14T15:17:10.793 に答える
0

UNIX® 環境でのスティーブンスの高度なプログラミングを使用すると、解決するはずです。

同様のプログラムの例が必要な場合は、Linux sysvinitと、Apple のlaunchdや init の BSD バリアントなどの他のバリアントを参照してください。もう 1 つの例は、インターネットのスーパー サーバーである inet.d です。( Appleまたはxinit.dからのソース)

于 2012-07-14T12:51:33.103 に答える