信号是进程之间通信的方式,但我有一些问题什么是信号陷阱?陷阱与操作系统中的信号有何关系?
答案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
“捕获信号”(也称为安装信号处理程序)是在收到信号时执行某些操作。下面是一个小 shell 脚本来说明:
#!/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 秒,然后使用 发出 SIGUSR1 信号kill
。该脚本捕获该信号并调用其bye
函数。
操作系统定义每个信号的默认行为。通过捕获它,程序可以更改默认值。守护进程经常以这种方式捕获 SIGHUP,以在程序运行时强制重新读取配置文件。