LinuxC——5.信号
LinuxC——5.信号
1.❤️信号
信号是一种通信机制。
常用信号
SIGABRT 6 终止进程,abort函数产生
SIGALRM 14 超时,调用alarm产生
SIGBUS 7 硬件故障
SIGCHLD 17 子进程状态改变
SIGINT 2 终止进程
SIGIO 29 异步通知信号
SIGKILL 9 无条件终止一个进程,不可被捕获或忽略
SIGTERM 15 kill pid默认的信号
2.🧡kill命令
kill -l 查询信号列表
kill +信号编号 PID
比如kill -15 13000
发送一个15的信号给13000
kill -SIGRILL 3000
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
pkill -SIGINT a.out // 杀死a.out
3.💛signal
一般来说,大多数发送信号,因为内核、硬件发生了一些事情
core文件
某些信号终止进程的时候,保存程序当前结束的时候,进程在内存中的代码和数据。
signal函数
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
// 调用成功返回上次处理方式,失败返回
signum 信号编号
hander 捕获函数
#include <stdio.h>
#include <signal.h>
int main() {
signal(SIGINT, SIG_IGN);
signal(SIGINT, SIG_DFL);
while(1) {}
return 0;
}
// SIGINT 2 control+c
// SIG_IGN 忽略信号处理
// SIG_DFL 使用默认信号处理
#define SIG_IGN ((void(*)(int))0)
#define SIG_DEF ((void(*)(int))1)
#define SIG_ERR ((void(*)(int))-1)
// KILL信号不能忽略和捕获
使用fork进行复制信号,则子进程继承父进程的信号
在调用exec加载新程序后,fork之前,父进程设置的是忽略或者默认,新程序依然有效
在调用exec加载新程序后,fork之后,父进程设置的自定义,新程序无效
4.kill、raise、alarm
- kill——指定pid发送信号
- raise——当前进程发送信号
- alarm——设置一个时间,进行发送SIGALRM信号(默认是终止)
- pause——永久挂起
进程pause或sleep的时候,我们进行发送一个空的捕获函数,进程被唤醒
5.信号屏蔽字
信号屏蔽字:放在进程表task_struct结构体变量中。信号屏蔽字是一个64位的unsigned int数字,如果为1表示信号屏蔽了,默认信号屏蔽字的值都为0
- sigempty # 全部设置为1
- sigaddset # 进行赋值
- sigprocmask # 进行信号屏蔽
sigemptyset(&set);
sigaddset(&set, SIGINT);
sigprocmask(int h, &set, NULL);