//
// Created by w on 2023/3/11.
//
#include <signal.h>
#include <unistd.h>
#include <iostream>
using namespace std;
// 在终端中反复对进程发信号SIGINT。理论上进程栈会反复跳转到此处。
// 但如果信号挂钩已经在执行了,不会被新的信号打断,新的信号会堆积。(但是对于同类型的新信号,只会保留最后一条。)
// 即意味着:在信号挂钩函数执行期间,不管收到多少条同类信号。信号挂钩函数最多会被额外再触发一次而已。
void IntProcessor(int nSignal) {
cout << "receive" << nSignal << endl;
int sec = 10;
while (sec-- > 0) {
sleep(1);
cout << "signal processing" << endl;
}
}
void setSigProcessor() {
//屏蔽除了SIGINT之外的其他信号
sigset_t sgset;
sigfillset(&sgset);
sigdelset(&sgset, SIGINT);
sigprocmask(SIG_SETMASK, &sgset, nullptr);
//为SIGINT设置挂钩函数
signal(SIGINT, IntProcessor);
cout << "after register signal handler" << endl;
}
int main() {
cout << "cur pid " << getpid() << endl;
setSigProcessor();
while (true) {
sleep(1);
}
}
Linux信号屏蔽以及挂钩处理
于 2023-03-11 22:19:35 首次发布