什么是信号陷阱?

什么是信号陷阱?

信号是进程之间通信的方式,但我有一些问题什么是信号陷阱?陷阱与操作系统中的信号有何关系?

答案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,以在程序运行时强制重新读取配置文件。

相关内容