Bashのマニュアルによると
組み込み関数やシェル関数ではなく単純なコマンドを実行しようとすると、シェルがキャッチしたトラップを次のようにリセットします。シェルの親から継承された値、そしてシェルが無視したトラップは無視されます
execve() マンページ説明する
execve(2) 中に処理された信号の処理は、次のようにリセットされます。デフォルト;無視された信号処理は変更されません。 」
「デフォルト」と「シェルの親から継承された値」は同じですか?
execve()
シグナル設定の処理方法をさらに変更せずにbashを呼び出すことはできますかexecve()
?
ありがとうございます。
答え1
いいえ、「デフォルト」と「シェルの親から継承された値」は同じではありません。 execve の場合、「デフォルト」は、SIG_DFL
次の原因となる基本操作を表します。man 7 signal
。 bashの例では、「シェルの親から継承された値」は、その信号が親SIG_IGN
によって無視されると子も無視されることを意味します。
ここで何が起こっているのかを理解する鍵は、「プロセス」という言葉です。SIG_DFL
またはとは異なるカスタム信号処理機能を表しますSIG_IGN
。新しいプロセスには、前のプロセスで使用したシグナルハンドラがないため、execveにリセットする必要があります。
最新バージョンのexecveのマンページでは、残りのLinuxで使用されている用語と一致するように、「処理済み」シグナルを「キャッチ」シグナルとして参照します。これは、基本信号と無視された信号とはまだ異なります。
シンプルバージョン:bashまたはbashの上にマークされている信号がある場合は、新しい子にもSIG_IGN
その信号が表示されます。SIG_IGN
それ以外の場合はSIG_DFL
新しい子になります。新しい子にはbashまたはその親のハンドラがないため、新しい子ではハンドラにすることはできません。