信号的简介
信号(signal):在 Linux 系统中,信号是一种进程间通信(IPC)的机制,主要用于通知进程发生了某些异常或特殊情况。信号可以由硬件异常(如除零错误)、软件异常(如非法内存访问)或来自其他进程的通知(如终止请求)触发。Linux 支持多种信号,每种信号都有其特定的用途和默认行为。
- 信号的类型
linux中有哪些信号,可以通过kill命令查询:
信号名称可以用数字表示,例如图中数字就一一对应了信号名称。在linux中,当程序接受到信号后,可以对信号进行捕捉,不同的信号有对应处理逻辑。
仅仅列举了常用信号,其他信号暂不做说明。
名称 | 编号 | 备注 |
---|---|---|
SIGINT | 2 | 程序终止(interrupt)信号, 通常是Ctrl+C时发出 |
SIGKILL | 9 | 用来立即结束程序的运行. 本信号不能被阻塞、被处理、被忽略 |
SIGUSR1 | 10 | 留给用户使用 |
SIGUSR2 | 12 | 留给用户使用 |
SIGTERM | 15 | 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号. |
SIGSTOP | 19 | 停止(stopped)进程的执行;本信号不能被阻塞、被处理、被忽略 |
- 信号的产生
程序在terminal执行中,常常通过ctrl+c来强制结束程序;如果程序在后台执行,常常通过kill命令杀死制定程序的pid。这就是信号产生的两种方式(硬件中断和软件中断)
验证各种信号
timer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>
#include <signal.h>
static void signal_handler(int signum)
{
switch (signum)
{
case SIGINT:
printf("SIGINT: %d\n", signum);
break;
case SIGUSR1:
printf("SIGUER1: %d\n", signum);
break;
case SIGUSR2:
printf("SIGUER2: %d\n", signum);
break;
case SIGTERM:
printf("SIGTERM: %d\n", signum);
break;
default:
break;
}
}
int main(int argc, char *argv[])
{
signal(SIGINT, signal_handler);
signal(SIGUSR1, signal_handler);
signal(SIGUSR2, signal_handler);
signal(SIGTERM, signal_handler);
while (g_main_run)
{
sleep(1);
}
printf("exit...\n");
return 0;
}
结果:
第一个终端:
第二个终端: