問題タブ [signal-handling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ クラス内でシグナルを使用することは可能ですか?
私はこのようなことをしています:
gccを使用してUbuntuに取り組んでいます。
しかし、それはコンパイルされません。それは不平を言っています:
エラー: タイプの引数が
void (MyClass::)(int)
一致しませんvoid (*) (int)
手がかりはありますか?それとも、クラス内でシグナルを使用できないだけなのでしょうか? シグナルは C でのみ許可されますか?
私のコンパイラは英語ではないため、エラー メッセージはおおよその翻訳です。
signal-handling - 共有ライブラリまたは DLL のシグナル ハンドラを作成していますか?
私はアプリケーションA(ある会社Xによる)を持っています。このアプリケーションを使用すると、独自の関数を記述できるようになるため、機能を拡張できます。
アプリケーション A の構成ファイルでユーザー関数を呼び出すようにアプリケーション A に指示します (これにより、アプリケーション A がユーザー作成関数を呼び出さなければならないことがわかります)。アプリ A は、ユーザーが作成した関数を呼び出す前にアプリケーション A に登録する必要がある関数ポインターを使用します。
本番環境でユーザーが作成した関数にバグまたは障害がある場合、Appl A は機能を停止します。たとえば、ユーザーが作成した関数にセグメンテーション違反があるとします。
したがって、アプリケーション A は共有 DLL ファイルからユーザーが作成した関数をロードします。これは、ユーザーが作成した関数がアプリケーション A のプロセス アドレス空間で実行されることを意味します。
セグメンテーション フォールト、ゼロ除算、スタック オーバーフローなどの特定のシグナルを処理したいのですが、アプリケーション A には、このために記述された独自のシグナル ハンドラがあります。
アプリケーション A にほとんど影響を与えずに適切にクリーンアップできるように、ユーザーが作成した関数の例外をキャッチする独自のシグナル ハンドラーを作成するにはどうすればよいですか? ユーザー関数はアプリケーション A のプロセスで呼び出されるため、OS はユーザー関数ではなく、アプリケーション A で記述されたシグナル ハンドラーを呼び出します。
どうすればこれを変更できますか? 私は OS が自分の関数で記述されたシグナル ハンドラーを呼び出すことを望んでいますが、本質的に非同期である自分の関数によって生成されたシグナルに対してのみです。
注: 私はアプリケーション A のソース コードを持っていません。別の会社によって管理されているため、変更を加えることができません。
私は C を使用しますが、Linux、solaris、およびおそらく Windows プラットフォームでは C のみを使用します。
c++ - グローバルに知られ、自動的に削除される一時ディレクトリを作成しますか (C++)?
C++ では、一時ディレクトリに書き込む必要のある関数がいくつかあります。理想的には、(I/O オーバーヘッドを最小限に抑えるため) すべてが書き込まれる 1 つの一時ディレクトリのみが作成されます。プログラムが終了すると、そのディレクトリは自動的に削除されます。
ただし、実際にディレクトリを使用する関数のみがその作成と削除を担当する必要があると思うため、メイン関数で一時ディレクトリの作成と削除を処理したくありません。また、メイン関数は、一時ディレクトリが使用されていることを必ずしも認識していません。
これが私が試したことです(以下のコードを参照):どこからでもグローバルに呼び出すことができるgetTempDir()関数は、最初の呼び出しでのみディレクトリを作成し、すべての呼び出しでディレクトリ名を返します。最初の呼び出しでは、デストラクタがディレクトリを削除する小さな DirRemover オブジェクトへの静的な boost::shared_ptr も作成します。そのデストラクタは、プログラムの終了時に自動的に呼び出されます。
問題は、プログラムの終了に失敗した場合や kill などで FileRemover デストラクタを呼び出さないことです。より良い解決策はありますか?
コードは次のとおりです。
algorithm - 基数 10 の数値表示のアルゴリズム - 更新ごとの最小変更
簡単な要約:
表示が更新されるたびに最小桁数 (10 進数) が変更されるように、4 桁の速度信号を表示するアルゴリズムを探しています。
例えば:
詳細:
4 桁の LCD ディスプレイに速度信号 (0 ~ 3000 RPM) を表示する必要があるプロジェクトに取り組んでいます。理想的なディスプレイ ソリューションはアナログ ゲージですが、私はデジタル ディスプレイにこだわっています。表示は機械のオペレーターが読み取りますが、できるだけ読みやすくしたいと考えています。
オペレーターは、シグナルの正確な値をあまり気にしません。彼は値が何であるか (最も近い 10 RPM まで) を知りたがり、マシンの動作の変化に応じて値が上下するのを見たいと思うでしょう。彼はそれがいたるところに飛び跳ねるのを見たくないでしょう。
これが私がこれまでに行ったことです:
- 数値を最も近い 10 RPM に丸めて、最後の桁が常に 0 になるようにします
- 電気ノイズと通常のセンサーの変動によって読み取り値が一度に 10 RPM を超えてジャンプしないように、信号をフィルター処理します。
- 同じ値 (例: 990 - 1000) を超える場合を回避するために、信号に +/-10 RPM ヒステリシスを追加しました。
これにより、信号が安定している場合 (約 75% の時間) はきれいに処理されますが、信号が定常状態から別の定常状態に移行するときに、信号に多くの不要な変動が見られます。信号が 100 RPM から 1000 RPM に変化すると (たとえば)、信号は途中で多くの数値を通過します。数値を実際に読んで理解するには少し時間がかかるため、これらすべての中間状態に到達してもほとんど意味がないように思われます。単純にディスプレイの更新レートを下げてみましたが、満足のいく結果にはなりませんでした。同時に、ディスプレイの動きが鈍く、びくびくしたように感じました。数字が変化する前に顕著な遅延があり、その後大きな飛躍 (100、340、620、980、1000) で移動します。
提案:
例に示すようにディスプレイを動作させたい:
- 表示は 1 秒に 2 回更新されます
- ある定常状態から別の定常状態への移行に 2 秒以上かかることはありません。
- 入力信号が現在表示されている値よりも高い場合、表示される信号は増加しますが、入力信号値よりも高くなることはありません。
- 入力信号が現在表示されている値より低い場合、表示される信号は減少しますが、入力信号値より低くなることはありません。
- 更新ごとに最小桁数を変更する必要があります (できれば 1 桁のみ)
- できるだけ早く表示信号と入力信号の差を縮めるために、上位桁から変更する必要があります。
上記のルールに従って「適切な」4桁の10進数を出力するアルゴリズムを思い付くことができますか、または知っていますか?
関数プロトタイプは、疑似コードで次のようになります。
テキストの壁で申し訳ありません。質問に答える人が、私がすでに経験したことをカバーしないように、これまでの進捗状況を記録したかったのです。
c - 謎の SIGINT を受け取るアプリケーション
いくつかのさまざまな UNIX プラットフォーム (この問題は SunOS 5.10 で発生しています) 用に C で書かれた小さなデーモン アプリケーションがあります。これは基本的に、シリアル ポートを開き、そのポートを介して入ってくる情報をリッスンするだけです。
この特定の例では、デーモンは、シリアル ポート経由で送信された単一の送信 (ファイルの価値のあるデータなど) を読み取ったように見え、SIGINT を受信します。これは毎回起こります。他の顧客は、SIGINT を受信せずにこのセットアップを非常によく似た方法で使用します。明らかに、ユーザーは Ctrl-C を押していません。比較的単純なシグナル ハンドラーが用意されているので、それが起こっていることは確実にわかります。
他に何がこれを引き起こしている可能性がありますか? ここの質問をグーグルで調べてみると、SIGINTを引き起こす可能性のある他のことについての説明があまり見つかりませんでした。また、コードを調べたところ、raise() への呼び出しはなく、とにかく SIGINT を送信しない kill(pid, 0) への単一の呼び出ししか見つかりませんでした。
どんな考えや洞察も間違いなく高く評価されます。
python - WindowsのPythonサブプロセスにSIGINTを送信できますか?
Windowsでgdbプロセスを管理するPythonスクリプトがあり、ターゲットプロセス(gdbによって管理される)を停止するために、生成されたプロセスにSIGINTを送信できる必要があります。
Win32で使用できるのはSIGTERMだけのようですが、コンソールからgdbを実行してCtrl + Cを実行すると、明らかにSIGINTを受信していると見なされます。機能がすべてのプラットフォームで利用できるようにこれを偽造する方法はありますか?
(私はサブプロセスモジュールとpython 2.5 / 2.6を使用しています)
perl - fork()を実行するデーモンのシグナル処理の管理
Linuxで実行され、この優れた回答で説明されているテンプレートに従っている堅牢なデーモンをperlで作成したいと思います。ただし、私の状況にはいくつかの違いがあります。最初に、Parallel::ForkManager start() and next
を使用しています。イベントの直後にフォークするexec('handle_event.pl')
そのような状況で、私は次の質問があります:
- シグナルハンドラーはどこで定義すればよいですか。それらを親(デーモン)で定義し、子に継承されると想定する必要がありますか?
- 実行
exec('handle_event.pl')
すると、ハンドラーはexec全体で継承されますか(ハンドラーはfork
)全体で継承されますか? - で新しいシグナルハンドラーを再定義した場合
handle_event.pl
、この定義は親で定義されたものをオーバーライドしますか? - このような状況でのベストプラクティスは何ですか?
ありがとうございました
python - Python - すべてのシグナルをトラップする
Linux の python 2.6 では、以下を使用して TERM シグナルを処理できます。
一度に1つずつ設定する以外に、プロセスによって受信されたすべてのシグナルのハンドラーを設定する方法はありますか?
c - シグナルハンドラーにいるかどうかをテストする方法はありますか?
大規模なプロジェクトのさまざまな場所から呼び出すことができるログ モジュールに取り組まなければなりません。私が抱えている問題は、シグナルハンドラー内で実行されるコードからモジュールが呼び出される場合があることです。通常、logging モジュールには localtime() と strftime() を使用して時間データが含まれますが、もちろんこれらの呼び出しは非同期シグナルに対して安全ではなく、シグナル ハンドラー内から呼び出されるとデッドロックが発生する可能性があります。たとえば、処理中にすべてのシグナルハンドラーにフラグを設定させることを除いて、コードが現在シグナルハンドラーコンテキストで実行されているかどうかを確認する方法は (GNU/Linux システム上で) ありますか? シグナル ハンドラーを単純化したほうがよいと思いますが、この場合、ログ モジュールを呼び出す場所を選択することはできません。