1.信号入门知识
1.1信号基本概念
信号是进程之间异步通知的一种方式。
1.2查看信号列表

1.3信号三种处理方式
正常处理
忽略
自定义
2.信号如何产生
信号产生通常有五种方式:
2.1终端键盘产生信号
典型信号:SIGINT(Ctrl+C)、SIGQUIT(Ctrl+)、SIGTSTP(Ctrl+Z)
2.2系统调用发出
函数:kill()(向指定进程发送信号)、raise(向当前进程发送信号)、tgkill()
2.3硬件异常触发
常见信号:
SIGSEGV:有段错误引起(非法访问内存)
SIGFPE:浮点异常(如除0错误)
SIGILL:非法指令(CPU无法执行)
2.4软件条件引起
定时器到期:alarm()触发SIGALRM
子进程状态变化:
子进程终止--->SIGCHLD
子进程被暂停/恢复--->SIGCONT/SIGSTOP
管道断裂:向无读端写数据--->SIGPIPE
3.信号捕捉
3.1关键API
3.1.1传统方式:SIGNAL()(简单但不可靠)
#include <signal.h>
void (*signal(int sig,void (*headler)(int)))(int);
void headler(int sig)
{
write(1,"Got SIGNAL\n",12);
}
int main()
{
signal(SIGINT,headler);//标记2号信号处理方式为headler
while(1);//持续运行
}
3.1.2现代方式:SIGACTION()(推荐)
struct sigaction
{
void (*sa_handler)(int);//简单处理函数
void (*sa_sigaction)(int,siginfo_t *,void *);//高级处理
sigset_t sa_mask;//屏蔽的信号
int sa_flags;//状态位
}
//安全捕获SIGSEGV
void segv_handler(int sig,siginfo_t *info,void *ucontext)
{
printf("Segfault at address %p\n",info->si_addr);
_exit(1);
}
int main()
{
struct sigaction act;
act.sa_sigaction = segv_handler;
sigemptyset(&act.sa_mask);
act.sa_falgs=SA_SIGINFO;
sigaction(SIGSEGV,&act,NULL);
int *ptr=NULL;
*ptr=42;//触发段错误
}
4.信号阻塞
4.1信号阻塞概念
信号阻塞是Linux系统中控制信号递送的关键机制,它允许进程屏蔽特定的信号,确保关键代码不被打断。
4.2阻塞的三种状态
--->Generated:信号产生
Generated--->Pending: 被阻塞
Pending --->Delivered: 解除阻塞
Delivered --->Handled: 执行处理
4.3关键系统调用
4.3.1SIGPROCMASK()——设置进程级阻塞掩码
#include <signal.h>
int sigprocmask(int how,const sigset_t *set,sigset_t *oldset);
参数说明:
how:操作类型(SIGBLOCK(添加阻塞)|SIG_UBLOCK(解除阻塞)|SIG_SETMASK(直接替换))
set:要操作的信号集
odlset:返回旧的信号集(可为NULL)
4.3.2pthread_sigmask()——线程级阻塞
int pthread_sigmask(int how,const sigset_t *set,sigset_t *odlset);
3389

被折叠的 条评论
为什么被折叠?



