トラップは外部プログラムにどのような影響を与えますか?

トラップは外部プログラムにどのような影響を与えますか?

無視されないトラップは、サブシェルに入るときにデフォルトの動作に設定する必要があります。

源泉:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_28

明らかに、シェルから呼び出される外部プログラムの場合も同様です。trap "" SIGNALこの信号をキャプチャ(無視)するよう努めてください。ただし、trap action SIGNAL呼び出されず、action何も実行せず、信号処理が元のデフォルト値に設定されているようです。

この動作はどこで定義されていますか?

ベストアンサー1

trapsignal()これはシェルの組み込み機能であり、/へのインターフェースを提供しますsigaction()。この点で、外部コマンドは信号設定を変更する他の言語と同じように動作します。

システムコールを介して別のコマンドを実行すると、execve()プロセス(信号ハンドラのコードを含む)のメモリ(コードを含む)がクリアされ、新しい実行可能ファイルのコードに置き換えられるため、シグナルハンドラは生き残ることができません。

POSIXは次のように言います。execve():

呼び出しプロセスイメージでデフォルトアクション()に設定されているシグナルをSIG_DFL新しいプロセスイメージでもデフォルトアクションに設定する必要があります。例外的にSIGCHLD、呼び出されたプロセスイメージによって無視()に設定された信号は、SIG_IGN新しいプロセスイメージによって無視されるように設定する必要があります。呼び出しプロセスイメージによってキャプチャされるように設定された信号は、新しいプロセスイメージのデフォルトジョブに設定する必要があります。(望むより<signal.h>)。

SIGCHLD呼び出しプロセスイメージでシグナルを無視するように設定した場合、シグナルが無視されるように設定されてSIGCHLDいるか、新しいプロセスイメージでデフォルトジョブに設定されているかは指定されません。

trap '' NALSIG_IGN信号と配置を設定しますtrap - NAL SIG_DFL

trap追加の要件があります(これらの多くは制限と見なされ、一部のシェル実装では無視される可能性があります)。

  • プロセスが分岐するとシグナルハンドラが継承されますが、シェルではハンドラがサブシェルからリセットされます。これは、親や子に頻繁に送信されますが、時には送信されないSIGINT / SIGQUIT / SIGHUP / SIGTSTPなどのいくつかの信号に役立ちます。
  • POSIXシェルは、起動時に無視されたシグナルハンドラをユーザーが復元することを許可しません。
  • 非同期コマンドの一部の信号は自動的に無視されます。
  • SIGCHLDとの混合は通常、シェルがそれ自体で処理するため、機能しません。
  • 私はシェルスクリプトの信号処理がしばしば信頼できず、移植性がないことを常に発見しました。

おすすめ記事