2

私はアプリケーションA(ある会社Xによる)を持っています。このアプリケーションを使用すると、独自の関数を記述できるようになるため、機能を拡張できます。

アプリケーション A の構成ファイルでユーザー関数を呼び出すようにアプリケーション A に指示します (これにより、アプリケーション A がユーザー作成関数を呼び出さなければならないことがわかります)。アプリ A は、ユーザーが作成した関数を呼び出す前にアプリケーション A に登録する必要がある関数ポインターを使用します。

本番環境でユーザーが作成した関数にバグまたは障害がある場合、Appl A は機能を停止します。たとえば、ユーザーが作成した関数にセグメンテーション違反があるとします。

したがって、アプリケーション A は共有 DLL ファイルからユーザーが作成した関数をロードします。これは、ユーザーが作成した関数がアプリケーション A のプロセス アドレス空間で実行されることを意味します。

セグメンテーション フォールト、ゼロ除算、スタック オーバーフローなどの特定のシグナルを処理したいのですが、アプリケーション A には、このために記述された独自のシグナル ハンドラがあります。

アプリケーション A にほとんど影響を与えずに適切にクリーンアップできるように、ユーザーが作成した関数の例外をキャッチする独自のシグナル ハンドラーを作成するにはどうすればよいですか? ユーザー関数はアプリケーション A のプロセスで呼び出されるため、OS はユーザー関数ではなく、アプリケーション A で記述されたシグナル ハンドラーを呼び出します。

どうすればこれを変更できますか? 私は OS が自分の関数で記述されたシグナル ハンドラーを呼び出すことを望んでいますが、本質的に非同期である自分の関数によって生成されたシグナルに対してのみです。

注: 私はアプリケーション A のソース コードを持っていません。別の会社によって管理されているため、変更を加えることができません。

私は C を使用しますが、Linux、solaris、およびおそらく Windows プラットフォームでは C のみを使用します。

4

3 に答える 3

2

使用しているプラ​​ットフォームを指定しないため、Linux について回答します。Windows でも有効なはずです。

シグナル ハンドラを設定すると、使用するシステム コールは前のハンドラを返します。そのシグナルの処理に興味がなくなったら、それを返すことができるようにします。

signalに関するシグナル MSDN エントリの Linux man ページ

あなたはアプリケーションにロードされた共有ライブラリなので、シグナルハンドラの操作に問題はないはずです。アプリケーション自体を中断する可能性を減らすために、必要な最小値をオーバーライドしてください (一部のアプリケーションは非同期通知にシグナルを使用します)。

于 2009-01-04T08:18:06.253 に答える
1

これを行う最もクリーンな方法は、何らかの IPC メカニズムを介して埋め込まれた共有 DLL コードと通信する別のプロセスでアプリケーション コードを実行することです。他のプロセスに影響を与えることなく、プロセスで必要なシグナルを処理できます。通常、あなたが言及する条件(セグフォルト、ゼロ除算、スタックオーバーフロー)は、プログラムのバグを示しており、終了します。バグの根本原因を修正する以外に、これらを「処理」するためにできることはあまりありません。

于 2016-11-01T16:12:02.110 に答える
-5

C++ では、コードを try-catch に入れることでこれらをキャッチできます。

try
{
   // here goes your code
}
catch ( ... )
{
   // handle segfaults
}
于 2009-01-04T07:53:19.237 に答える