2012-01-05 12 views
0

bashでシグナル処理を記述するサンプルコードを理解しようとしています。例32-7のhttp://tldp.org/LDP/abs/html/debugging.htmlでは、作者のコメントはSIGINTを捕捉していると述べていますが、トラップはEXIT用です。バックグラウンドプロセスでSIGINTをトラップする

 
{ 
    trap "exit" SIGUSR1 
    sleep $interval; sleep $interval 
    while true; do 
     ... 
    done; } &   # Start a progress bar as a background process. 

pid=$! 
trap "echo !; kill -USR1 $pid; wait $pid" EXIT  # To handle ^C. 

なぜEXITのトラップはSIGINT(CTL-C)にbackgroudのプロセスに正しい信号(SIGUSR1)を送信しますか?

これがなぜ機能するのかご理解いただきありがとうございます。

答えて

0

EXIT擬似信号が正常終了時に両方を上昇させ、スクリプトが中断されているときにこの質問を読み違えます。

+1

いいえ、それはプロセスが 'exit(2)'自身を(スクリプトの終わりに達するか、明示的な「終了」命令の実行)。 – fge

+0

これを適切に処理するには、スクリプトに 'trap 'exit 127' 2 15'のようなものが必要です。 – tripleee

+0

ああ。とった。さらにテストした後、キーボード割り込みでINTのトラップが実行され、EXITのトラップが発生したことがわかりました。 – user1131035

1

EXITは、bashのtrapの特別なハンドラです。信号ではありません。出口信号はありません。このトラップは、bashプロセスが終了するたびに実行されます。したがって、ユーザーがbashプロセスを終了すると、SIGUSR1がバックグラウンド・プロセスに送られ、バックグラウンド・プロセスもトラップされ、そのプロセスで「exit」が実行されることを確認します。そうすれば、セッションを終了しても、バックグラウンドプロセスは永遠に実行されず、終了することもあります(これはコメントが説明しようとしているものです)。

編集:私は私の元の応答

+0

また、コードを誤解しています。擬似信号「EXIT」のトラップは明らかに最後の行に設定されています。これにより、Bashに終了ハンドラが作成されます。しかし、コードは不完全です。 – tripleee

+0

...実際、スクリプトは長時間実行されているいくつかのコマンドを続けています(問題のリンクを参照)。 – tripleee

+0

@tripleeeあなたは絶対に正しいです!私はコードの最後の行を処理しませんでした!私は私の応答を編集します(上のコードは完成しました) –

関連する問題