signalは、そのプロセスに送られたシグナルに対する処理をどうするか設定を変更したり、ハンドラをセットして独自の処理を行わせることができる。
プロセス実行中にCtrl+CによりSIGINTシグナルが送られた時、デフォルトの動作ではプロセスは強制終了する。
signalでSIG_IGNをセットすることで、10秒間はCtrl+Cを押してもプロセスは終了しない。
その後、signalでSIG_DFLをセットすることで、デフォルト動作に戻す。今度はCtrl+Cでプロセスは終了する。
$ vi signal.c $ gcc signal.c -o signal $ ./signal process running...(signal(SIGINT, SIG_IGN)) ^Cprocess running...(signal(SIGINT, SIG_IGN)) process running...(signal(SIGINT, SIG_IGN)) ^Cprocess running...(signal(SIGINT, SIG_IGN)) process running...(signal(SIGINT, SIG_IGN)) process running...(signal(SIGINT, SIG_IGN)) ^Cprocess running...(signal(SIGINT, SIG_IGN)) process running...(signal(SIGINT, SIG_IGN)) process running...(signal(SIGINT, SIG_IGN)) process running...(signal(SIGINT, SIG_IGN)) process running...(signal(SIGINT, SIG_DFL)) process running...(signal(SIGINT, SIG_DFL)) process running...(signal(SIGINT, SIG_DFL)) ^C [bg1@localhost signal]$
"^C"がCtrl+Cを押した形跡。
signal(SIGINT, SIG_IGN)である間は、Ctrl+Cでもプロセスは終了しないが、signal(SIGINT, SIG_DFL)になったら、Ctrl+Cでプロセスが終了した。
Sample/unixsyscall/signal/signal/src/signal at master · bg1bgst333/Sample · GitHub