問題タブ [sigint]

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.

0 投票する
5 に答える
14905 参照

python - Eclipseコンソールで実行されているプログラムにSIGINT(Ctrl-C)を送信する

Eclipseで実行構成をセットアップしましたが、プログラムにSIGINT(Ctrl+ C)を送信する必要があります。SIGINTの後に実行されるプログラムにはクリーンアップコードがあるため、Eclipseの[終了]ボタンを押しても機能しません(SIGKILLを送信すると思います)。CTRLコンソールに+を入力Cしても機能しません。

Eclipseコンソール内で実行されているプロセスにSIGINTを送信するにはどうすればよいですか?

(FWIW Twistedデーモンを実行していて、正しくシャットダウンするにはTwistedが必要です。これはSIGINTでのみ発生します)

0 投票する
3 に答える
2565 参照

python - スレッド化/マルチプロセッシングPythonスクリプトが正しく終了しないのはなぜですか?

クリーンにシャットダウンできるようにする必要があるサーバースクリプトがあります。通常のステートメントをテストしているときに、通常の方法では機能しないtry..exceptことに気付きました。Ctrl-C通常、私はこのような長時間実行されるタスクをラップします

そのため、でタスクを正常にシャットダウンできますCtrl-C。私はこれまでこれで問題に遭遇したことはありませんがCtrl-C、この特定のスクリプトが実行されているときにヒットすると、スクリプトはキャッチせずに終了しますCtrl-C

初期バージョンはProcessfromを使用して実装されましmultiprocessingた。Threadfromを使用してスクリプトを書き直しましたthreadingが、同じ問題があります。threading私はこれまで何度も使用したことがありますが、multiprocessing図書館は初めてです。Ctrl-Cいずれにせよ、私はこれまでこの行動を経験したことがありません。

通常、私は常に番兵などを実装してQueuesThreadインスタンスを整然と閉じますが、このスクリプトは応答なしで終了します。

signal.SIGINT最後に、このようにオーバーライドしてみました

ここCtrl+Cで実際にキャッチされましたが、ハンドラーは実行されず、何も出力されません。

threading/multiprocessingアスペクトに加えて、スクリプトの一部にはC++ SWIGオブジェクトが含まれています。それがそれと関係があるのか​​どうかはわかりません。OSXLionでPython2.7.2を実行しています。

だから、いくつかの質問:

  1. 何が起きてる?
  2. どうすればこれをデバッグできますか?
  3. 根本的な原因を理解するために何を学ぶ必要がありますか?

注意:スクリプトの内部は独自のものであるため、コード例を示すことはできません。ただし、これを自分でデバッグできるように、ポインターを喜んで受け取ります。私は、誰かが私を正しい方向に向けることができるかどうかを理解するのに十分な経験を積んでいます。

編集:C++ SWIG奇妙な動作の原因を確認するためにインポートなどをコメントアウトし始め、ライブラリのインポートに絞り込みました。ライブラリをインポートする理由がC++ SWIG「盗む」という考えはありCtrl-Cますか?私は有罪の図書館の著者ではありませんが、私のSWIGの経験は限られているので、どこから始めればよいのかよくわかりません...

編集2: Windowsマシンで同じスクリプトを試したところ、Windows7ではCtrl-C期待どおりにキャッチされました。私は実際にはOSXの部分を気にするつもりはありません、とにかくスクリプトはWindows環境で実行されます。

0 投票する
2 に答える
2642 参照

python - ^C/KeyboardInterrupt を使用して子スレッドで Python raw_input() を中断する

マルチスレッドの Python プログラムでは、1 つのスレッドが組み込みのraw_input()を使用してコンソール入力を要求することがあります。raw_input プロンプトが表示されているときに、シェルで ^C と入力して (つまり、SIGINT シグナルを使用して) プログラムを終了できるようにしたいと考えています。ただし、子スレッドが raw_input を実行している場合、^C と入力しても何も起こりません。Return を押す (raw_input を離れる) まで、KeyboardInterrupt は発生しません。

たとえば、次のプログラムでは:

^C と入力しても、入力が終了するまで何も起こりません。ただし、呼び出すだけの場合T().run()(つまり、シングルスレッドの場合: メインスレッドで raw_input を実行するだけ)、^C はすぐにプログラムを閉じます。

おそらく、これは SIGINT がメイン スレッドに送信され、コンソール上でフォークされたスレッド ブロックが読み取られている間、メイン スレッドが中断されている (GIL を待機している) ためです。メイン スレッドは、raw_input が返された後に GIL を取得するまで、シグナル ハンドラを実行できません。(これについて間違っている場合は訂正してください。私は Python のスレッド実装の専門家ではありません。)

SIGINT をメインスレッドで処理できるようにしながら、raw_input のような方法で stdin から読み取り、プロセス全体をダウンさせる方法はありますか?

[Mac OS X といくつかの異なる Linux で上記の動作を確認しました。]


編集:上記の根本的な問題を誤解しています。さらに調査すると、join()シグナル処理を妨げているのはメイン スレッドの呼び出しです。これは、スレッド全体が終了するまでシグナルが実際に延期されていることを意味します。したがって、これは実際にはまったく関係ありませんraw_input(結合が完了しないようにバックグラウンド スレッドがブロックされているという事実だけです)。

0 投票する
0 に答える
1052 参照

c# - Console.CancelKeyPress を使用する Mono アプリケーションをバックグラウンドで実行できない

Linux の Mono に Console.CancelKeyPress を使用してリッスンするコンソール アプリケーションがありますSIGINT。ただし、このアプリケーションは常にすぐに停止するため、バックグラウンドでの実行を拒否します。

縮小された例を次に示します。

このアプリケーションを bash の下でバックグラウンドで実行しようとすると、次の結果になります。

「停止」メッセージを表示するには、Enter キーをもう一度押す必要がありましたが、すぐに表示されます。ご覧のとおり、Console.WriteLine通話に到達することはありません。

SIGINTを使用して送信しようとすると(ハンドラーが に設定されてkillいないため、プロセスを終了する必要があります)、 を使用してプロセスを再開するまで何も起こりません。e.Canceltruefg

フォアグラウンドでプロセスを開始し、それを中断してctrl-z使用するbgと、再びすぐに停止しますが、今度は送信SIGINTしてから再開するとfg、ハンドラーが呼び出されます。

イベント ハンドラーの割り当てを削除するConsole.CancelKeyPressと、プロセスはバックグラウンドで正常に実行されます。

Mono 2.10.8 と Debian 6.0.2 を使用しています。

他のすべてが失敗した場合は、 を使用して必要な機能を複製できますがMono.Unix.UnixSignal、誰かがこれに対する解決策を持っている場合は、ぜひ聞きたいです。

更新:Console.CancelKeyPress私の目的には別の問題があるようです。nohup入力がコンソールではなく /dev/nullになるようにプロセスを実行します。この状況では、CancelKeyPressを使用して SIGINT を送信しても、Mono はイベントをトリガーしませんkillUnixSignalでは、そうです。

0 投票する
0 に答える
161 参照

perl - Perl 5.14.2 の SIGINT ハンドラでの Perl の getc の問題

ここに私のテスト環境があります:

コードスニペット:

プログラムを実行した後、「5678」が最初に出力され、入力を待ってから、「eeee」に続いて「ctrl-c」を入力すると、ハンドラーはハンドラーの getc 関数をスキップして「1234」と「4444」を連続して出力します、その後、待機中の入力がハングします(まだ入力を待機しているのはハンドラーの外側の getc だと思います)。「q」と入力すると、「q」が出力されます。

だから私の質問は:

  1. ハンドラーの getc 関数が機能しないのはなぜですか? この問題は、他の perl リリースには存在しないようです。
  2. ハンドラーの getc 関数を機能させるにはどうすれば解決できますか?
0 投票する
4 に答える
2251 参照

lisp - (一般的な) Lisp での Unix シグナル処理

私はこの件について少し調査しましたが、空白を見つけています。Common Lisp で Unix シグナル処理を行う実装依存の方法があるようですが、シグナル処理を行うクロス実装方法を提供するパッケージはありますか?

私は主に SIGINT をリッスンし、アプリで正常にシャットダウンしたいと考えています。LinuxでClozure CL 1.7を使用しています...前述のように、これはパッケージに最適ですが、実装固有のコードに頼らなければならない場合は問題ありません。

また、SIGINT を使用することに完全に同意しているわけではありません (理想的ではありますが)。必要に応じて別の信号を使用できます。

これが厄介になる場合、アプリの外部から Lisp アプリを適切にシャットダウンするための他の提案はありますか? 私が持っていた 1 つのアイデアは、アプリが監視するファイルを作成し、ファイルが検出された場合はシャットダウンすることです...ハックのようなものですが。

ありがとう!

0 投票する
2 に答える
2433 参照

cygwin - Ctrl-cはcygwinで動作を停止しました

Ctrl-c(SIGINT / SIGTERM)がcygwinで機能しなくなりました。思い出すと、これはTTY設定と関係があるかもしれません。再び動作させる方法についてアドバイスしてください。意図的に何も変更しませんでした

stty -aからの出力:

ctrl-cを押すと、cmdウィンドウのタイトルがSelect〜から〜に変わります。Ctrl-cもプログラムの実行を中断しますが、新しい行は作成しません。

私はセッションssh-agentでも実行しています

これはコンピュータの再起動で修正される可能性があると思いますが、何かアイデアがあれば教えてください。

0 投票する
2 に答える
3966 参照

c++ - signal()が他のシグナルハンドラーを上書きする

このsignal()関数は、プロセスが設定した可能性のある他のシグナル呼び出しを上書きしますか?つまり、SIGINTハンドラーがプロセスによってセットアップされ、DLLがsignal(SIGINT,xxx)独自の終了コードを処理するために呼び出す場合、元のSIGINTハンドラーは無効になりますか?

0 投票する
2 に答える
3211 参照

linux - Ctrl +Cを押すとLinuxが常に「^C」を出力するのはなぜですか?

私はLinuxでシグナルを研究してきました。そして、SIGINTをキャプチャするためのテストプログラムを実行しました。

出力は次のようになりますが、次のようになります。

Ctrl + Cを押すと、フォアグラウンドプロセスグループ内のすべてのプロセスがSIGINTを受け取ることを理解しています(プロセスがそれを無視することを選択しない場合)。

それで、シェル(bash)と上記のプログラムのインスタンスの両方がシグナルを受信したのですか?各「おっと」の前の「^C」はどこから来ていますか?

OSはCentOSで、シェルはbashです。

0 投票する
3 に答える
4627 参照

c - SIGINT で割り当てられたメモリを解放するためのベスト プラクティス

select私はIOを多重化するためにそのようなものを使用する簡単なプログラムを持っています。
「サーバー」プロセスを中断するために、SIGINTに反応する sig_handler を統合しました。

メモリが割り当てられるたびに、包含メソッドはそれ自体または呼び出しメソッドを解放します。

使用valgrindすると、一部の割り当てが解放されていないことがわかります。
その必要はないかもしれませんが、信号を処理する最善の方法を知りたいです。STRG + Cを押しても呼び出しが呼び出されない
ようです。 したがって、私の最初のアプローチであるブレーク条件でループを終了するのは無意味です。free

プログラム全体を閉じる前に、すべてをクリーンアップする可能性はありますか?

ヒントやアドバイスをありがとう。