いつプログラムでSIGINTを強制的に送信しますか?

いつプログラムでSIGINTを強制的に送信しますか?

おすすめの方法を知っています。終了フォアグラウンドプロセスは、SIGTERMプロセス自体にリソースを整理/解除する機会を提供するため、シグナルを介して実行されます。信号はコマンドによってのみ生成/送信でき、kill pkill killallここまでできたすべてのコマンドによって生成/送信できます。しかも、それ基本これらのコマンドの信号です。

今私はSIGINT信号を知っています邪魔するプロセス。したがって、「似ています」終了

しかし、私は次の答え(抜粋)を読みました。

SIGINTそしてSIGQUIT目標は具体的に~のため端末からの要求:これらの信号を生成するために特定の入力文字を指定できます(端末制御設定によって異なります)。基本ジョブは、基本ジョブと変更できないジョブとSIGINT同じ種類のプロセス出口です。SIGTERMSIGKILL

これまでは、回答に従ってキーの組み合わせ(+)でSIGINTトリガーされます。ctrlcそして 理論的に SIGINT同じことを行うには、SIGTERM次の手順を実行します。プログラム自体にリソースを整理/解除する機会を提供する

正直なところ、多くのチュートリアルを読んだ後でも、この情報を明確に見つけて確認することはできません。たとえば、次に由来します。

さまざまな場所でこの信号を使用してください邪魔するそして終了お尻。

しかも同じ答えによると、@JonathanLefler~のコメント(抜粋)は以下の通りです。

これが重要です:プログラムの実行中に単一文字を使用して端末で生成できますSIGINTSIGQUIT他の信号は、他のプログラムによって何らかの形で生成されなければなりません(たとえば、コマンドを介してkill)。SIGINTあまり暴力的ではありませんSIGQUITコアダンプ

これまでに考えられる結論の1つは、SIGINTキーの組み合わせまたはコマンドでのみトリガーできることですSIGTERM

公開理由:そうであれば理論的に SIGINTそしてSIGTERM

質問

  • いつSIGINTプログラムで送信する必要がありますか?

に表示されますのでkill -l使用してください。

その他の質問

また、理論的に SIGINT- と同じ効果があり、SIGTERMどちらも無視/遮断/処理できます。

  • なぜ作られたのですSIGINTか?
  • ctrl+が最初から割り当てられていないのはなぜcですかSIGTERM

正直そうSIGINTだと思いました。いいえそのまま安全邪魔するしたがって、このプロセスでは、一部のデータは一貫性のない/完全な状態のままになります。

ベストアンサー1

これ基本動作そしてSIGINTSIGTERM他の多くの信号と同様に)プロセスを終了するために使用されます。これは、例えば文書化されている。Linuxのマニュアルページsignal(7)、「標準信号」の下の表を参照してください。そのうちのいくつかは以下に引用されています。実際にも同じだ。

テーブルの一部:

       Signal      Standard   Action   Comment
────────────────────────────────────────────────────────────────────────
       SIGHUP       P1990      Term    Hangup detected on controlling terminal
                                       or death of controlling process
       SIGINT       P1990      Term    Interrupt from keyboard
       SIGKILL      P1990      Term    Kill signal
       SIGTERM      P1990      Term    Termination signal

さて、これは基本動作。ほとんどの信号に対してこれを受信するプログラムは、信号処理機能を事前に設定して、それをキャプチャしたり完全に無視したりできます。SIGINT通常、ユーザーがCtrl-Cを押してaを送信し、SIGTERM受信プログラムを終了する必要がある他のプログラムから送信することが多いことを知っている場合、プログラムはそれを別の方法で処理することを決定できます。

インタラクティブプログラムは、すぐに終了せずにすべての長期実行ジョブを終了することを決定し、ユーザーが終了するか、SIGINT他のタスクを実行するかを選択できます。まだ終了中SIGTERM。これにより、より単純なプログラムには、すべてのSIGHUPデータを保存して終了する同じハンドラ(たとえば、他のハンドラもあります)があります。

たとえば、Debian で試した対話型 Bash シェルは、何も実行せずにSIGINT現在のコマンドラインを消去します。 (SIGTERM少し驚くべきことですが、これはプロセスグループ全体にシグナルを送信することに関連している可能性があります。)これは、ターミナル接続が消えることを意味するSIGHUPのでSIGHUP、より多くのコマンドを読んでも役に立ちません。

ほとんどの信号は、受信プロセスが(潜在的に)終了する前にクリーンアップ操作を実行できるようにします。 2つの異常信号は次のSIGKILLとおりSIGSTOPです。できないキャッチまたは無視されますが、クリーンアップ操作を実行せずに、無条件に即座にプロセスを破壊または停止します。 (カーネルは依然としてオペレーティングシステムリソースに対して必要なクリーンアップを実行しますが、ここではクリーンアップはプロセスメモリに保存されていないデータに関するものです。)

もちろん、基本的にプロセスを終了する他の信号もあります。同様にSIGALRM、システムコールによって設定されたタイマーによって送信されますalarm()。デフォルトの動作はいくつかの状況で役に立ちますが、プログラムに特定の定期的なタスクを実行するように指示するなど、一般的な目覚まし時計として便利です。

おすすめ記事