📅  最后修改于: 2023-12-03 15:36:43.078000             🧑  作者: Mango
信号函数是在 Linux 系统中使用的一种函数,它可以使程序在接收到特定的信号时执行特定的操作。信号函数的使用可以帮助程序员更好地管理和控制程序的行为。
下面是一个简单的信号函数示例,它会在程序接收到 SIGINT 信号时输出一条消息。
#include <stdio.h>
#include <signal.h>
void sigint_handler(int sig) {
printf("Received SIGINT signal\n");
}
int main() {
signal(SIGINT, sigint_handler);
while (1) {
// 程序其他的逻辑
}
return 0;
}
这个程序中,我们首先定义了一个名为 sigint_handler
的函数,它会在接收到 SIGINT 信号时被调用。接着,在 main
函数中,我们使用 signal
函数将 sigint_handler
函数与 SIGINT 信号关联起来。最后,我们在程序的主循环中执行其他的逻辑,等待信号的到来。
下面是一些常用的信号及其含义:
| 信号名称 | 含义 | | :------- | :----------------------------------------------------------- | | SIGINT | 中断信号,通常由用户在控制台上按 Ctrl+C 触发 | | SIGTERM | 终止信号,用于请求程序安全终止 | | SIGHUP | 终端挂起,当终端连接结束时,终端驱动程序通常会给前台进程组发送该信号 | | SIGKILL | 强制终止信号,不可被忽略或捕获 | | SIGQUIT | 退出信号,由用户在控制台上按 Ctrl+\ 触发 |
除了使用 signal
函数将信号关联到特定的处理函数之外,还可以使用 sigaction
函数来进一步控制信号的处理方式。使用 sigaction
函数可以实现对信号的捕获、忽略、以及对信号处理函数的修改和替换等操作。
下面是一个简单的使用 sigaction
函数的例子,它会在程序接收到 SIGINT 信号时忽略掉该信号。
#include <stdio.h>
#include <signal.h>
void sigint_handler(int sig) {
// do nothing
}
int main() {
struct sigaction sa;
sa.sa_handler = sigint_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, NULL);
while (1) {
// 程序其他的逻辑
}
return 0;
}
在这个例子中,我们首先定义了一个名为 sigint_handler
的空处理函数,它不执行任何操作。然后,我们使用 sigaction
函数将 SIGINT 信号关联到这个处理函数上。在 sigaction
函数中,我们将 sa_handler
字段设为 sigint_handler
,表示将该信号捕获并交由这个处理函数处理。同时,我们使用 sigemptyset
函数初始化了 sa_mask
字段,表示在处理 SIGINT 信号时不屏蔽任何其他信号。最后,我们在程序的主循环中执行其他的逻辑,实现对 SIGINT 信号的忽略。