0
  1. GDB は、実行中のプロセスに自身をアタッチするという偉業をどのように達成していますか?

  2. 実行中のプロセスに CLI コマンドを発行できる同様の機能が必要です。たとえば、show total_messages_processed? のようにプロセスの内部状態を照会できます。Linux で実行中のプロセスにコマンドを発行するためのサポートを構築するにはどうすればよいですか?

  3. 実行中のプロセスに CLI 通信機能を提供し、カスタム コマンド用に拡張できるライブラリはありますか?

プロセス自体はC++で書かれています

4

3 に答える 3

3

GDB は CLI を使用してデバッグ対象と通信しません。ptraceシステムコール/APIを使用します。

CLI は「コマンドライン インターフェイス」を意味します。プロセス間の通信の最も単純な形式はstdin/stdoutです。これは、パイプによって実現されます。例えば:

ps -ef | grep 'httpd'

の標準出力ps(プロセス リストになります) は の標準入力に接続され、grepプロセス リストの出力を 1 行ずつ処理します。

両方のプログラムを作成していますか、それとも既存のプロセスと通信したいですか? コンテキストがないと、「show total_messages_processed」が何を意味するのかわかりません。


プログラムに何らかのステータスを伝えさせたいだけの場合は、次のようなアプローチが適していddます。プロセスにSIGUSR1シグナルを送信すると、現在の統計情報がダンプされ、stderr処理が続行されます。

$ dd if=/dev/zero of=/dev/null&
[1] 19716
$ pid=$!
$ kill -usr1 $pid
$ 10838746+0 records in
10838746+0 records out
5549437952 bytes (5.5 GB) copied, 9.8995 s, 561 MB/s
于 2012-10-25T04:44:40.720 に答える
2

プロセスでAF_UNIXソケットを使用することを検討しましたか? またはDバス?または、おそらくSOAPまたはRCP/XDR用の HTTP サーバーにします (例: libonionまたはlibmicrohttpdを使用)。

Advanced Linux ProgrammingAdvanced Unix Programmingに関する本を読んでください。おそらくlibevのようなイベントライブラリの上で、おそらくpoll(2)のような多重化システムコールを(おそらく間接的に)使用したいと思うでしょう。多分あなたはそのためにスレッドを捧げたいと思うでしょう。

どのようなプロセスを考えているのかを知らなければ、それ以上は言えません。その一部を再設計する必要がある場合があります。プロセスが従来の計算集約型のものである場合、それは SMTP サーバー プロセスと同じではありません。特に、プロセスにイベント ループがある場合は、監視目的で使用および拡張します。イベント ループがない場合 (たとえば、従来の数値処理の「バッチ」アプリケーションなど)、追加する必要がある場合があります。

于 2012-10-25T04:54:47.987 に答える
0

この場合、現在実行中のプロセスを 2 つに分割する「フォーク」をお勧めします。親プロセスは stdin を読み取り、コマンドを処理し、2 つのプロセス間で共有されるすべてのメモリを処理できます。理論的には、ロック、ミューテックス、セマフォ、シグナル、ソケット、またはパイプなどの高度なプロセス間通信をスキップすることもできますが、プロセスは必ずしもその状態をメモリに書き込んでおらず、レジスタに保持していることに注意してください。

fork では、オペレーティング システムはプロセスのローカル変数のコピーを作成します。その後、各プロセスは独自の内部状態を持ちます。したがって、データを渡す最も簡単な方法は、「共有メモリ」を割り当てることです。

スリープ/待機状態になり、別のシグナルでのみ終了するシグナルハンドラーを子プロセスに書き込むこともできます。これにより、子プロセスの内部状態を検査する時間を増やすことができます。この種のアプローチの主な理論的根拠は、デバッグ中のプロセスにデバッグされていることを認識させる必要がないということです。親プロセスと子プロセスは同じコード ベースを共有し、親プロセスが必要な出力メソッドを実装するだけで十分です (フォーマットto screen?) およびデータのシリアル化など。

于 2012-10-25T04:55:42.960 に答える