問題タブ [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.
python - Eclipseコンソールで実行されているプログラムにSIGINT(Ctrl-C)を送信する
Eclipseで実行構成をセットアップしましたが、プログラムにSIGINT(Ctrl+ C)を送信する必要があります。SIGINTの後に実行されるプログラムにはクリーンアップコードがあるため、Eclipseの[終了]ボタンを押しても機能しません(SIGKILLを送信すると思います)。CTRLコンソールに+を入力Cしても機能しません。
Eclipseコンソール内で実行されているプロセスにSIGINTを送信するにはどうすればよいですか?
(FWIW Twistedデーモンを実行していて、正しくシャットダウンするにはTwistedが必要です。これはSIGINTでのみ発生します)
python - スレッド化/マルチプロセッシングPythonスクリプトが正しく終了しないのはなぜですか?
クリーンにシャットダウンできるようにする必要があるサーバースクリプトがあります。通常のステートメントをテストしているときに、通常の方法では機能しないtry..except
ことに気付きました。Ctrl-C
通常、私はこのような長時間実行されるタスクをラップします
そのため、でタスクを正常にシャットダウンできますCtrl-C
。私はこれまでこれで問題に遭遇したことはありませんがCtrl-C
、この特定のスクリプトが実行されているときにヒットすると、スクリプトはキャッチせずに終了しますCtrl-C
。
初期バージョンはProcess
fromを使用して実装されましmultiprocessing
た。Thread
fromを使用してスクリプトを書き直しましたthreading
が、同じ問題があります。threading
私はこれまで何度も使用したことがありますが、multiprocessing
図書館は初めてです。Ctrl-C
いずれにせよ、私はこれまでこの行動を経験したことがありません。
通常、私は常に番兵などを実装してQueues
、Thread
インスタンスを整然と閉じますが、このスクリプトは応答なしで終了します。
signal.SIGINT
最後に、このようにオーバーライドしてみました
ここCtrl+C
で実際にキャッチされましたが、ハンドラーは実行されず、何も出力されません。
threading
/multiprocessing
アスペクトに加えて、スクリプトの一部にはC++
SWIG
オブジェクトが含まれています。それがそれと関係があるのかどうかはわかりません。OSXLionでPython2.7.2を実行しています。
だから、いくつかの質問:
- 何が起きてる?
- どうすればこれをデバッグできますか?
- 根本的な原因を理解するために何を学ぶ必要がありますか?
注意:スクリプトの内部は独自のものであるため、コード例を示すことはできません。ただし、これを自分でデバッグできるように、ポインターを喜んで受け取ります。私は、誰かが私を正しい方向に向けることができるかどうかを理解するのに十分な経験を積んでいます。
編集:C++ SWIG
奇妙な動作の原因を確認するためにインポートなどをコメントアウトし始め、ライブラリのインポートに絞り込みました。ライブラリをインポートする理由がC++ SWIG
「盗む」という考えはありCtrl-C
ますか?私は有罪の図書館の著者ではありませんが、私のSWIGの経験は限られているので、どこから始めればよいのかよくわかりません...
編集2: Windowsマシンで同じスクリプトを試したところ、Windows7ではCtrl-C
期待どおりにキャッチされました。私は実際にはOSXの部分を気にするつもりはありません、とにかくスクリプトはWindows環境で実行されます。
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
(結合が完了しないようにバックグラウンド スレッドがブロックされているという事実だけです)。
c# - Console.CancelKeyPress を使用する Mono アプリケーションをバックグラウンドで実行できない
Linux の Mono に Console.CancelKeyPress を使用してリッスンするコンソール アプリケーションがありますSIGINT
。ただし、このアプリケーションは常にすぐに停止するため、バックグラウンドでの実行を拒否します。
縮小された例を次に示します。
このアプリケーションを bash の下でバックグラウンドで実行しようとすると、次の結果になります。
「停止」メッセージを表示するには、Enter キーをもう一度押す必要がありましたが、すぐに表示されます。ご覧のとおり、Console.WriteLine
通話に到達することはありません。
SIGINT
を使用して送信しようとすると(ハンドラーが に設定されてkill
いないため、プロセスを終了する必要があります)、 を使用してプロセスを再開するまで何も起こりません。e.Cancel
true
fg
フォアグラウンドでプロセスを開始し、それを中断して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 はイベントをトリガーしませんkill
。UnixSignal
では、そうです。
perl - Perl 5.14.2 の SIGINT ハンドラでの Perl の getc の問題
ここに私のテスト環境があります:
コードスニペット:
プログラムを実行した後、「5678」が最初に出力され、入力を待ってから、「eeee」に続いて「ctrl-c」を入力すると、ハンドラーはハンドラーの getc 関数をスキップして「1234」と「4444」を連続して出力します、その後、待機中の入力がハングします(まだ入力を待機しているのはハンドラーの外側の getc だと思います)。「q」と入力すると、「q」が出力されます。
だから私の質問は:
- ハンドラーの getc 関数が機能しないのはなぜですか? この問題は、他の perl リリースには存在しないようです。
- ハンドラーの getc 関数を機能させるにはどうすれば解決できますか?
lisp - (一般的な) Lisp での Unix シグナル処理
私はこの件について少し調査しましたが、空白を見つけています。Common Lisp で Unix シグナル処理を行う実装依存の方法があるようですが、シグナル処理を行うクロス実装方法を提供するパッケージはありますか?
私は主に SIGINT をリッスンし、アプリで正常にシャットダウンしたいと考えています。LinuxでClozure CL 1.7を使用しています...前述のように、これはパッケージに最適ですが、実装固有のコードに頼らなければならない場合は問題ありません。
また、SIGINT を使用することに完全に同意しているわけではありません (理想的ではありますが)。必要に応じて別の信号を使用できます。
これが厄介になる場合、アプリの外部から Lisp アプリを適切にシャットダウンするための他の提案はありますか? 私が持っていた 1 つのアイデアは、アプリが監視するファイルを作成し、ファイルが検出された場合はシャットダウンすることです...ハックのようなものですが。
ありがとう!
cygwin - Ctrl-cはcygwinで動作を停止しました
Ctrl-c(SIGINT / SIGTERM)がcygwinで機能しなくなりました。思い出すと、これはTTY設定と関係があるかもしれません。再び動作させる方法についてアドバイスしてください。意図的に何も変更しませんでした
stty -aからの出力:
ctrl-cを押すと、cmdウィンドウのタイトルがSelect〜から〜に変わります。Ctrl-cもプログラムの実行を中断しますが、新しい行は作成しません。
私はセッションssh-agentでも実行しています
これはコンピュータの再起動で修正される可能性があると思いますが、何かアイデアがあれば教えてください。
c++ - signal()が他のシグナルハンドラーを上書きする
このsignal()
関数は、プロセスが設定した可能性のある他のシグナル呼び出しを上書きしますか?つまり、SIGINT
ハンドラーがプロセスによってセットアップされ、DLLがsignal(SIGINT,xxx)
独自の終了コードを処理するために呼び出す場合、元のSIGINT
ハンドラーは無効になりますか?
linux - Ctrl +Cを押すとLinuxが常に「^C」を出力するのはなぜですか?
私はLinuxでシグナルを研究してきました。そして、SIGINTをキャプチャするためのテストプログラムを実行しました。
出力は次のようになりますが、次のようになります。
Ctrl + Cを押すと、フォアグラウンドプロセスグループ内のすべてのプロセスがSIGINTを受け取ることを理解しています(プロセスがそれを無視することを選択しない場合)。
それで、シェル(bash)と上記のプログラムのインスタンスの両方がシグナルを受信したのですか?各「おっと」の前の「^C」はどこから来ていますか?
OSはCentOSで、シェルはbashです。
c - SIGINT で割り当てられたメモリを解放するためのベスト プラクティス
select
私はIOを多重化するためにそのようなものを使用する簡単なプログラムを持っています。
「サーバー」プロセスを中断するために、SIGINTに反応する sig_handler を統合しました。
メモリが割り当てられるたびに、包含メソッドはそれ自体または呼び出しメソッドを解放します。
使用valgrind
すると、一部の割り当てが解放されていないことがわかります。
その必要はないかもしれませんが、信号を処理する最善の方法を知りたいです。STRG + Cを押しても呼び出しが呼び出されない
ようです。
したがって、私の最初のアプローチであるブレーク条件でループを終了するのは無意味です。free
プログラム全体を閉じる前に、すべてをクリーンアップする可能性はありますか?
ヒントやアドバイスをありがとう。