無視されないトラップは、サブシェルに入るときにデフォルトの動作に設定する必要があります。
源泉:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_28
明らかに、シェルから呼び出される外部プログラムの場合も同様です。trap "" SIGNAL
この信号をキャプチャ(無視)するよう努めてください。ただし、trap action SIGNAL
呼び出されず、action
何も実行せず、信号処理が元のデフォルト値に設定されているようです。
この動作はどこで定義されていますか?
ベストアンサー1
trap
signal()
これはシェルの組み込み機能であり、/へのインターフェースを提供しますsigaction()
。この点で、外部コマンドは信号設定を変更する他の言語と同じように動作します。
システムコールを介して別のコマンドを実行すると、execve()
プロセス(信号ハンドラのコードを含む)のメモリ(コードを含む)がクリアされ、新しい実行可能ファイルのコードに置き換えられるため、シグナルハンドラは生き残ることができません。
呼び出しプロセスイメージでデフォルトアクション()に設定されているシグナルを
SIG_DFL
新しいプロセスイメージでもデフォルトアクションに設定する必要があります。例外的にSIGCHLD
、呼び出されたプロセスイメージによって無視()に設定された信号は、SIG_IGN
新しいプロセスイメージによって無視されるように設定する必要があります。呼び出しプロセスイメージによってキャプチャされるように設定された信号は、新しいプロセスイメージのデフォルトジョブに設定する必要があります。(望むより<signal.h>
)。
SIGCHLD
呼び出しプロセスイメージでシグナルを無視するように設定した場合、シグナルが無視されるように設定されてSIGCHLD
いるか、新しいプロセスイメージでデフォルトジョブに設定されているかは指定されません。
trap '' NAL
SIG_IGN
信号と配置を設定しますtrap - NAL
SIG_DFL
。
trap
追加の要件があります(これらの多くは制限と見なされ、一部のシェル実装では無視される可能性があります)。
- プロセスが分岐するとシグナルハンドラが継承されますが、シェルではハンドラがサブシェルからリセットされます。これは、親や子に頻繁に送信されますが、時には送信されないSIGINT / SIGQUIT / SIGHUP / SIGTSTPなどのいくつかの信号に役立ちます。
- POSIXシェルは、起動時に無視されたシグナルハンドラをユーザーが復元することを許可しません。
- 非同期コマンドの一部の信号は自動的に無視されます。
- SIGCHLDとの混合は通常、シェルがそれ自体で処理するため、機能しません。
- 私はシェルスクリプトの信号処理がしばしば信頼できず、移植性がないことを常に発見しました。