bashは `execve()`が信号処理をどのように処理するかを変更することなく`execve()`を呼び出すのですか?

bashは `execve()`が信号処理をどのように処理するかを変更することなく`execve()`を呼び出すのですか?

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またはその親のハンドラがないため、新しい子ではハンドラにすることはできません。

おすすめ記事