シグナル
シグナル(Signal)
例:
Ctrl + cを押したときにSIGINT
SIGINT: Ctrl+C や Del キーを押したときに発生する割り込みシグナル INT: interrupt
kill -9 <proc_id>のときのSIGKILL
SIGKILL: プロセスを強制終了させるためのシグナル
Ctrl + zを押したときのSIGTSTP
TSTP: terminal stop
code:c
typedef void (*sighandler_t)(int);
// signal()はLinuxのバージョンによって動作が違う場合があるので
// 移植性を求める場合はsigactionを使用した方がよい
sighandler_t signal(int signum, sighandler_t sighandler);
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
シグナルハンドラー内でprintfは使っていけないとのこと
関連
(ChatGPTChatGPT.iconに書いてもらったサンプルコード)
code:signal.c
volatile sig_atomic_t sigint_received = 0;
// SIGINT シグナルを捕捉するためのハンドラ関数
void sigint_handler(int __attribute__((unused)) sig) {
// シグナルを受け取ったことを示すフラグを設定
sigint_received = 1;
}
int main() {
// SIGINT シグナルハンドラを設定
signal(SIGINT, sigint_handler);
printf("Ctrl+C を押して SIGINT シグナルを送信してください。\n");
// 無限ループでプログラムを実行し続ける
while (!sigint_received) {
// 忙しくないループのために短いスリープを挿入
sleep(1);
}
// シグナルを受け取った後の処理
printf("SIGINT シグナルを受け取りました。\n");
printf("プログラムを終了します。\n");
return 0;
}
code:output
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 906 0 906 0 0 1014 0 --:--:-- --:--:-- --:--:-- 1014
Ctrl+C を押して SIGINT シグナルを送信してください。
^CSIGINT シグナルを受け取りました。
プログラムを終了します。
関連
確認用
Q. シグナル
Q. シグナルの使い方
Q. シグナルの標準動作
Q. シグナルハンドラ
Q. シグナルでやってはいけないこと
Q. シグナルハンドラ内でprintfを使ってはいけない理由はなぜか
Q. シグナルの例
Q. シグナル一覧
調査用
Wikipedia.icon
Wikipedia.icon
参考
シグナルハンドラの処理について
メモ