問題タブ [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.
bash - Ctrl-C を実行すると BASH で何が起こるか (ヒント、単に SIGINT を送信するだけではありません)
最初に少し背景を説明しapt-get install
ます。会社のインターネットからダウンロードすると、最初の 10 秒間は高速バースト (400 ~ 500KB/秒) になり、その後 10 分の 1 (40 ~ 50KB/秒) に落ちます。そして数分後、本当に惨めな状態になります (4-5KB/秒)。これは、システム管理者がある種のネットワーク スロットリング スキームを実装したと思わせます。
これで、ネットワークが単に不安定ではないことがわかりましapt-get install foo
た.すべてのパッケージがダウンロードされます。大きなパッケージでも非常に高速にダウンロードできます。特に、Ctrl-C でダウンロードを中断した後でも、apt-get は次の呼び出しでダウンロードを再開できるようです。Ctrl-C
apt-get install foo
もちろん、10 秒ごとに Ctrl-C Up Enter を押しながら画面を見つめていると、すぐに飽きてしまうので、シェル スクリプトを作成しました。
これはうまくいくようです。apt-get を生成し、10 秒間実行してから (SIGINT を送信して) 強制終了し、再度起動します。ただし、apt-get はその後の呼び出しでダウンロードを再開しないため、実際には機能しません。
sudo apt-get install foo
ある端末から実行kill -2 <PID of apt-get>
し、別の端末から実行した実験。その場合でも、apt-get を再起動しても、ダウンロードが再開されません。
したがって、明らかに Ctrl-C はSIGINT と同等ではありません。また、Ctrl-C を手動で実行すると、apt-get にダウンロードの状態を保存する機会が与えられます。問題は - それは何ですか?
編集
これらは私がこれまでに受け取った提案ですが、葉巻はありません. 謎が深まる!-
信号ではの代わりに に
sudo kill -2 $!
行く可能性があります。上記のように、特に apt-get の PID に SIGINT を送信しようとしても、apt-get がその状態を保存できないため、これは理由ではありません。sudo
apt-get
Sudo はシグナルをキャッチし、別のシグナルを apt-get に送信します。考えられるすべてのシグナルをapt-getに送信してみました!いずれのダウンロードも再開されません。Ctrl-C を実行して強制終了した場合にのみ、ダウンロードが再開されます。
Apt-get は、対話型シェルではなくスクリプトからのものである場合、SIGINT を異なる方法で処理します。繰り返しますが、上記の「実験」は、これが正しくないことを証明しています。
xcode - XCodeを使用してデバッグするときにSIGINTを生成するにはどうすればよいですか?
コンソールアプリがトラップSIGINT
されるため、正常に終了できます。
ただし、プログラムのデバッグ中にXCode内でCTRL+を押しても効果はありません。C
プロセスを見つけてターミナルウィンドウを使用しSIGINT
てプロセスに送信することはできますが、XCode内で実行できるより簡単なソリューションがあることを望んでいます。
matlab - MATLAB GUI 内からの SIGINT の送信
MATLAB GUI アプリケーション内から、測定システムからデータを読み取る外部プログラム (Windows のコンソール アプリケーション) を起動しています。データは複数のファイルに保存され、外部プログラムが終了するとすぐに MATLAB アプリケーションによって処理されます。問題はこれです:
Ctrl外部プログラムは、コマンド ラインで実行されている場合、SIGINT を発行することによって (つまり+を押すことによって) 正常に停止できますC。シグナル ハンドラーが SIGINT をトラップし、プログラムをシャットダウンします。「中止」ボタンを押して、MATLAB GUI アプリケーション内からこれを行う方法はありますか?
何時間も検索した後、MEX ファイルで SIGINT を検出する方法を示すhttp://www.caam.rice.edu/~wy1/links/mex_ctrl_c_trick/に出くわしました。MEX に外部プログラムを呼び出させるとうまくいくかもしれません (詳細についてはまだわかりませんが)。ただし、プログラムを停止するにはCtrl+が必要です。CGUI のプッシュ ボタンを介して SIGINT を送信するにはどうすればよいですか?
android - 狂ったようにアプリケーションが中断する
私は完全に実行されているC++(Androidネイティブ)アプリケーションを持っていました..次に、いくつかのtry {} catch {}ステートメントを導入しました。アプリケーションをデバッグすると、ランダムで正しいコードで狂ったように中断します。アプリケーションを実行すると、割り込みのために停止します。Zygote(app_process )は、シグナル2 ( SIGINT )について文句を言います。
大量のtry-catch句を追加する前に、アプリケーションにいくつかのtry-catch句が正常に実行されていました。この時点で、ネストされたtry-catchブロックがたくさんあると確信しています。おそらく、Android OSは、ネストされたブロックの多くの割り込みを処理できないのでしょうか。
Windowsでは同じコードが問題なく実行されることをお伝えしたいと思います。
python - Pythonでブロッキングメソッドを中断するにはどうすればよいですか?
通常、Ctrl + Cで割り込みをかけることができますが、スレッドを使用していると機能しない場合があります。以下の例を参照してください。
編集: 通訳に戻る方法はありますか?これまでの解決策は、Pythonと既存の名前空間を完全に殺します。
python - 遅いシステムコールでの SIGINT の処理
私はPythonを初めて使用するので、この質問が非常に基本的なものである場合はご容赦ください。
select モジュールを使用してソケットからデータを受け取りながら、キーボード割り込みを処理しようとしています。そのため、ソケットからのデータを待機し、それをコンソールに出力する select.select() 関数呼び出しがあります。
CTRL_C を押すと、select.error が発生したり、exceptions.IOError 例外が発生したりすることがあるようです。対応するエラー コードは、両方の例外で 4 です。
コール スタックの奥深くで KeyboardInterrupt 例外を処理するコードがいくつかあるため、ソケット接続を受け入れる関数で SIGINT を取得すると、KeyboardInterrupt 例外を再発生させたいだけです。また、接続関連の例外をキャッチしたいと考えています。
例外のエラー コードを確認し、それが 4 の場合は KeyboardInterrupt を発生させても安全でしょうか? これは、接続関連の例外をキャッチする能力に影響しますか? エラー コードに関する適切なリソースはありますか?
ありがとう!
bash - Ctrl-C(sigint)をbashにトラップするPerl
CTRL ^ C --Perl Monksをキャプチャする方法を読んでいますが、問題を解決するための適切な情報を取得できないようです。
重要なのは、無限ループがあり、ターミナルへの「マルチライン」プリントアウトです(代わりに使用するように指示されることは承知していますが、短いスクリプトの場合は、 sのncurses
束を書く方が快適ですprintf
)。Ctrl-Cをトラップして、この複数行の印刷が終了した後にのみスクリプトが終了するようにします。
スクリプトは(Ubuntu Linux 11.04)です:
これを実行してCtrl-Cを押すと、次のようになります(スクリプトが終了した後のターミナルカーソルの位置を示していることに注意してください_
)。
また:
...しかし、私は取得したい:
明らかに、ハンドラーは実行されていますが、期待するタイミング(または順序)ではありません。誰かがこれを修正する方法を明確にできるので、必要な出力を取得できますか?
よろしくお願いします。
linux - BashのスレッドでCtrl-CをトラップするPerl
PerlがbashでCtrl-C(sigint)をトラップする方法を見ながら; なぜスレッドで失敗するのか迷っています。私は次のスクリプトを試しています:
...そしてSIGINTハンドラーがデフォルト以外に設定されるとすぐに(Ctrl-Cによってexitが発生します)、基本的にスクリプトはCtrl-Cでの反応を停止します。
...そして私はsudo killall perl
スクリプトを終了するためにそうしなければなりません。
これらのリンクには、スレッドとCtrl-Cに関するビットがあります。
- sig INT(コントロールC)をスレッドに送信する-Dev Shed
- 解決済み:これはPerlスレッドのバグですか?-パールモンク
- CTRL^Cをキャプチャするにはどうすればよいですか-PerlMonks
- シグナルハンドラーはこのように機能するはずですか?
...しかし、bashのperlの下でCtrl-Cを「キャプチャ」することが絶対に不可能かどうかが決定的に答えられるかどうかはわかりません。
よろしくお願いします、
乾杯!
わかりました、私はそれを手に入れたと思います(しかし、私は参考のために前のエントリ(以下)を残しています...)
秘訣は、メインのSIGINTハンドラーから、kill
-を介してスレッドにシグナルを送信する必要があることです。次に、スレッドには(OPの最初のリンクからの)別のSIGINTハンドラーも必要です。そして、単にの代わりに、@ikegamiによる回答join()
のコードを使用する必要があります。
私はそこでそれをやり過ぎているかもしれません$toexit
が、少なくとも今これは結果です:
解決策をありがとうございました:)
乾杯!
PERL_SIGNALS
@mobによるtoの提案のおかげでunsafe
(Perl5.14は$ENV {'PERL_SIGNALS'}の「内部」設定を許可していません)、どこかに到達しています-現在Ctrl-Cが検出されています-しかし、どちらかで終了しますsegfault、またはエラーあり:
上記のコメントで、そのコードは次のように反応します。
Perl :: Signals :: Unsafe:を使用する以下を追加しても結果は同じです。
ほとんどそこに、うまくいけば誰かがチャイムを鳴らすことができます... :)
c++ - C++でのSIGINTsignal()/ sigaction
だからここに私のコードがあります:
SIGINTコマンド(Ctrl+C右?)を受信すると、関数sigHandleを整数値2(SIGINT番号)で呼び出す必要があり、メソッドが実行され、プログラムが終了しないことが、signal()についての私の理解です。
信号番号を印刷して先に進むだけですが、「Signal:2」を印刷すると終了します。
(最終的には最初の32個の割り込みを処理することになっていますが、 Ctrl+Cが最も難しいと考えたので、ここから始めます。)
主に、signal(SIGINT、SIG_IGN);を実行する場合。シグナルを正しく無視して終了しませんが、SIGINT割り込みを受信したかどうかを知る方法がありません。
以前、私はsigaction構造体で遊んでいましたが、実際の包括的なドキュメントが見つからなかったため、「生の」信号処理だけを使用することにしました。
これは私のシグアクションコードでした(上記と同じ問題):
ご協力いただきありがとうございます!
編集
OK SOマニュアルページとインターネットを何時間も調べた後、スタックの無限ループを保存し、割り込みが発生したときに、必要なことを実行してから再設定するという(非常に)ゲットーの解決策に出くわしました。スタックを元の場所に戻し、sigrelse()コマンドを呼び出して、変更されて再ロードされなかった可能性のある状態をリセットします。
私はこれがこの問題に対する最もエレガント/効率的/または社会的に受け入れられる解決策ではないことを理解していますが、それは機能し、私が知る限り、どこにもメモリが漏れていないので、それはすべて良いです...
私はまだこの問題の解決策を探しています、そして私は私のスタックがシェナニギンを再設定することを一時的な修正としてのみ見ています...
ありがとう!
unix - Ctrl-CとSIGINTの違いは何ですか?
例外を受け取った後にsegfaultsするPythonプログラムをデバッグしていKeyboardInterrupt
ます。これは通常Ctrl+C、シェルから押すことによって行われます。SIGINT
特定のコード変更でバグが修正されたかどうかをテストするために、起動後ランダムにプログラムに送信される小さなシェルスクリプトを用意しました。私が抱えている問題は、Ctrl+C送信が信号の送信とはプログラムに異なる影響を及ぼしSIGINT
、バグが発生しないように見えることです。そのため、2つのアクションの違いは何でしょうか。
このプログラムはキーボードアクションをまったくキャッチせず、いくつかのスレッド/プロセスを含むPythonプログラムです。シグナルハンドラーをインストールせず(Pythonはインストールしますが)、をstty -a
提供しintr = ^C
ます。すべてのサブプロセス/スレッドに送信し、プライマリプロセスにのみ送信する可能性があると思いますが、それは私の疑いの範囲ですCtrl+C。SIGINT
kill -INT
を送信するシェルスクリプトは次のとおりkill -INT
です。