信号名 | 信号编号 | 产生原因 | 默认处理方式 |
SIGHUP | 1 | 关闭终端 | 终止 |
SIGINT | 2 | ctrl + c | 终止 |
SIGQUIT | 3 | ctrl + \ | 终止+产生1个转储文件 |
SIGABRT | 6 | abort()函数 | 终止+转储 |
SIGPE | 8 | 算术错误 | 终止 |
SIGKILL | 9 | kill -9 pid | 终止,不可捕获/忽略 |
SIGUSR1 | 10 | 自定义 | 忽略 |
SIGSEGV | 11 | 段错误 | 终止+产生1个转储文件 |
SIGUSR2 | 12 | 自定义 | 忽略 |
SIGALRM | 14 | alarm()函数 | 终止 |
SIGTERM | 15 | kill pid | 终止(可以被忽略) |
SIGCHLD | 17 | 子状态变化 | 忽略 |
SIGSTOP | 19 | ctrl + z | 暂停,不可捕获/忽略 |
kill -signal pidkill -9 1231#include<stdio.h>#include<stdlib.h>#include<signal.h>#include<unistd.h>voidsignal_handler(int signum){printf("Received signal %d\n", signum);exit(0);}intmain(){// 注册 SIGINT 信号的处理函数signal(SIGINT, signal_handler);while (1) {printf("Running... Press Ctrl+C to stop.\n");sleep(1);}return 0;}
#include<stdio.h>#include<signal.h>#include<unistd.h>voidsignal_handler(int signum){printf("Received signal %d\n", signum);}intmain(){// 注册信号处理函数signal(SIGINT, signal_handler);// 阻塞 SIGINT 信号sigset_t newset, oldset;sigemptyset(&newset);sigaddset(&newset, SIGINT);sigprocmask(SIG_BLOCK, &newset, &oldset);printf("SIGINT is blocked. Press Ctrl+C.\n");sleep(5); // 等待 5 秒// 解除阻塞sigprocmask(SIG_UNBLOCK, &newset, NULL);printf("SIGINT is unblocked. Press Ctrl+C.\n");while (1) {sleep(1);}return 0;}