信号はプロセス間の通信方法ですが、信号トラップが何であるかについていくつかの質問があります。トラップはオペレーティングシステムのシグナルとどのような関係がありますか?
答え1
時には千の言葉の価値がある例があります。このC ++コードは非常に単純な信号ハンドラを公開します。
void gracefullShutdown(int sigNum) {
// cleanup or do wathever you need to do in case of received signal(s)
// Terminate this executable
exit(sigNum);
}
int main(int argc, char* argv[]) {
signal(SIGINT , gracefullShutdown);
signal(SIGTERM , gracefullShutdown);
std::cout << "starting..." << std::endl;
while(1);
exit(EXIT_SUCCESS);
}
プログラムの実行中にCtrl + Cを押すと、LinuxカーネルはプログラムにSIGINTシグナルを送信し、通常終了しますが、この場合は終了する前に特定のタスクを実行できます。
答え2
「信号を捕まえる」(または信号ハンドラの取り付け)は、信号が受信されたときに何かをすることです。説明するための小さなシェルスクリプトは次のとおりです。
#!/bin/sh
bye() {
echo bye
exit 1
}
trap bye SIGUSR1
echo hello
for Y in $(jot 80)
do
printf '.'
sleep 1
done
echo not reached
実装する:
$ shtrap & { sleep 3 && kill -s SIGUSR1 $!; }
[2] 22471
hello
...[1] User defined signal 1 sleep 1
bye
スクリプトをバックグラウンドプロセスで起動し、3秒待ってからkill
。スクリプトはシグナルを捕捉し、そのbye
機能を呼び出します。
オペレーティングシステムは、各信号の基本動作を定義する。これをキャプチャすると、プログラムはデフォルト値を変更できます。デーモンは、プログラムの実行中に設定ファイルを強制的に読み取るようにするために、この方法でSIGHUPをキャプチャすることがよくあります。