在Linux中,信号(Signals)是一种进程之间通信和进程控制的机制。它们是异步事件,用于通知进程发生了某些事件,例如终止请求、用户输入、硬件错误等。每个信号都有一个唯一的数字标识,称为信号编号。可以使用信号来与进程进行交互,例如终止进程、暂停进程等。
以下是一些常用的信号以及它们的功能:
SIGINT (2): 当用户在终端按下 Ctrl+C 时发送给进程的信号。默认情况下,它会终止进程。
SIGTERM (15): 请求进程正常终止的信号。它允许进程在终止之前清理资源。
SIGHUP (1): 当终端连接断开时发送的信号。常用于通知进程重新读取其配置文件。
SIGKILL (9): 强制终止进程的信号。进程无法忽略或捕获它,直接导致进程终止。
SIGSTOP (19) 和 SIGCONT (18): 分别用于暂停和恢复进程的执行。
SIGUSR1 (10) 和 SIGUSR2 (12): 用户定义的信号,可以由进程根据需要自行使用。
在C语言中,可以使用signal函数来捕获信号并指定处理函数。然而,signal函数的使用受到一些限制,因为它不能保证在所有情况下都可靠地工作。更好的方法是使用sigaction函数来管理信号处理。以下是一个示例代码,展示了如何使用sigaction来处理SIGINT信号:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void sigint_handler(int signum) {
printf("Received SIGINT. Exiting...\n");
exit(0);
}
int main() {
struct sigaction sa;
sa.sa_handler = sigint_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
return 1;
}
while (1) {
// Your program logic here
}
return 0;
}
这个例子中,我们定义了一个信号处理函数sigint_handler,当接收到SIGINT信号时,会打印一条消息并退出程序。使用sigaction函数,我们将这个信号处理函数与SIGINT信号关联起来。