このページの内容は次のとおりです。
Bashがインタラクティブの場合、トラップなしでSIGTERMを無視し(したがって、「kill 0」がインタラクティブシェルを終了しない)、SIGINTがキャプチャされて処理されます(スタンバイの組み込みが中断されるように)。 BashがSIGINTを受け取ると、すべての実行ループを中断します。
通常、プログラムがシグナルを受信すると、SIGINT
プログラムは終了します。でも、bash
信号を受けても終了しませんがSIGINT
、実行ループが中断されます。」。それはどういう意味ですか?
答え1
bash
これは、現在実行中の組み込み関数とループが中断されることを意味します。 SIGINT効果を得るbash
にはCtrl+D
答え2
結局、bashは壊れた。シェルプロセスがsigintを処理する方法は、それをキャッチしてからすべての処理を停止し、保留中のすべての前景プロセスが終了するのを待つことです。実際、SIGINTがフォアグラウンドで実行されているすべてを中断してはならない理由はありません。これがプロセスグループがずっと前に作成された理由です。ユーザーが提供するすべてのbash "コマンド"は、同じpgroupからプロセスを分岐し、シグナルをそのpgroupに渡す必要があります。 pgroupを正しく使用すると、分岐されたすべてのプロセスは基本的にbashと同じ信号処理を必要とするため、信号を渡す必要はありません。 nohupは、すべての分岐プロセスがighup ==を無視するようにする必要があります。
もともと、Unixシェルの信号処理とプロセス関係の多くの詳細がbashから欠落していました。特に、シェルスクリプトのSIGINTはループから離れるのではなく、シェルスクリプト全体を完全に停止する必要があります。これにより、より多くの処理が開始され、SIGINTによって以前の操作が完了しなかったため、ファイルが破損する可能性があります。
はい、トラップステートメントはCleanerを終了するのに役立ちます。しかし、元のUnixシェル実装ではまったく必要ありませんでした。主に一時ファイルの使用やその他の同様の詳細をクリーンアップするメカニズムです。シェルはシャットダウンする必要があるときにシャットダウンする必要があるため、信頼性が高く簡単に中断できるシェルスクリプトを作成するのは困難です。