%60%20%E3%81%8C%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB%E5%87%A6%E7%90%86%E3%82%92%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%95%E3%82%89%E3%81%AB%E5%A4%89%E6%9B%B4%E3%82%92%E5%8A%A0%E3%81%88%E3%81%9A%E3%81%AB%20%60execve()%60%20%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
Bashのマニュアルにはこう書いてある
組み込みコマンドやシェル関数以外の単純なコマンドを実行する場合、シェルによってキャッチされたトラップは次のようにリセットされます。シェルの親から継承された値シェルによって無視されたトラップは無視されます
execve(2)の実行中、処理されたシグナルの処理は次のようにリセットされる。デフォルト; 無視された信号の処理は変更されません。"
「デフォルト」と「シェルの親から継承された値」は同じですか?
bash は、シグナル処理の処理execve()
方法にさらなる変更を加えずに呼び出しますか?execve()
ありがとう。
答え1
いいえ、「デフォルト」と「シェルの親から継承された値」は同じではありません。execveの場合、「デフォルト」は を指しSIG_DFL
、指定されたデフォルトのアクションを引き起こします。man 7 signal
bash の場合、「シェルの親から継承された値」とは、まさにその通りの意味です。つまり、そのようなシグナルがSIG_IGN
親によって無視された場合 ( )、その子でも無視されます。
ここで何が起こっているかを理解するための鍵は、「handled」という単語です。これは、またはとは異なるカスタム シグナル ハンドラー関数を指しますSIG_DFL
。SIG_IGN
新しいプロセスには古いプロセスが使用していたシグナル ハンドラー関数がないため、execve によってリセットする必要があります。
execve マニュアルページの新しいバージョンでは、Linux の他の部分で使用される用語に合わせて、「処理された」シグナルを「キャッチされた」シグナルと呼んでいることに注意してください。これは、デフォルト シグナルと無視されるシグナルの両方とは異なります。
シンプルバージョン: bash または bash の親のいずれかに としてマークされたシグナルがある場合SIG_IGN
、そのシグナルは新しい子にもありますSIG_IGN
。そうでない場合は、SIG_DFL
新しい子に存在します。bash またはその親からのハンドラーは新しい子には存在しないため、新しい子のハンドラーになることはできません。