- 信号的类型
- 标准信号(1~31)
- 实时信号(34~64)
- 查看所有信号
- kill -l
- man 7 signal
- 信号的默认行为
- Term(终止执行)
- Core(终止执行并产生coredump)
- Ign(忽略)
- Stop(停止运行)
- Cont(继续运行)
- 信号的行为注册
- signal(2)
- 默认处理(SIG_DFL):信号由该特定信号的默认动作处理。
忽略信号(SIG_IGN):忽略信号,即使没有意义,代码执行仍将继续。
函数处理程序:定义一个特定的函数来处理信号。
void handler_function (int parameter);parameter就是信号序号 - SIGKILL和SIGTOP不能改变
- 默认处理(SIG_DFL):信号由该特定信号的默认动作处理。
- signal(2)
- 产生信号
- Ctrl+c —>SIGINT Ctrl+\ —>SIGQUIT Ctrl+z —>SIGSTOP
- kill(2) / alarm(2)将信号发给进程或进程组
int kill(pid_t pid, int sig);
参数:
pid:可能选择有以下四种
pid大于零时,pid是信号欲送往的进程的标识。
pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。pid小于-1时,信号将送往以-pid为组标识的进程。
alarm()
功能与作用:alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程 - 程序出错—》段错误
- 信号特点
- 丢失—》显示信号结构是位图
- 打断阻塞的系统调用
- 响应过程是嵌套的
- 忽略信号的本质mask=1
- 信号处理函数中不能用longjmp跳转—》信号处理函数调用结束将mask置0
- 信号处理函数使用可重入函数
- 无法阻止信号的到来,只能选择不去响应(本人自行添加的)
不可重入函数
(a)使用静态数据结构
(b)他们调用malloc和free
©他们是标准I/O函数
- 信号集
- sigset_t
- sigemptyset(2)//手册第二章
- sigaddset(2)
- sigdelset(2)
- sigfillset(2)
上面四个函数成功的返回值为1,若出错返回值为-1. - sigismember(2)
若真则返回1,若假则返回0,若出错返回-1
sigset_t set;
sigempty(&set);//初始化信号集,清除其中所有信号
sigfillset(&set)//初始化信号集,使其包括所有信号。
//所有程序在使用信号集前都要调用sigempty()或者sigfillset()函数进行一次初始化。
sigaddset(&set,SIGINT)//将SIGINT信号添加到信号集中
sigdelset(&set,SIGINT)//将SIGINT信号删除信号集
sigismember(&set,SIGINT)//判断SIGINT信号是否在信号集set里
- 设置信号屏蔽字(mask位图)
- sigprocmask(2)
sigprocmask(int how,const sigset_t *restrict set,sigset_t *restrict oset);
oset当前信号屏蔽字由它返回)
- sigprocmask(2)
how | 说明 |
---|---|
SIG_BLOCK | 该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号集的并集。set包含了我们希望阻塞的附加信号 |
SIG_UNBLOCK | 该进程新的信号屏蔽字是当前信号屏蔽字和set所指向信号集补集的交集。set包含了我们希望解除阻塞的信号 |
SIG_SETMASK | 该进程新的信号屏蔽字将被set指向的信号集的值代替 |
sigset_t set,oset//请按上面步骤自行初始化
sigprocmask(SIG_BLOCK, &set, &oldset);
- sigsuspend(2)—>信号驱动程序运行(收到信号程序运行)
- sigprocmask(SIG_SERMASK, &set, &oldset)
- pause(2)
- sigprocmask(SIG_SETMASK, &oldset, NULL)
- sigaction(2)!!!
//代码原型
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
- struct sigaction
struct sigaction结构体介绍
struct详细解释这位写的很好
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}
- sa_handler
- SIG_DFL
- SIG_IGN
- 函数
- sa_flags
- SA_SIGINFO--->sa_sigaction信号处理函数
- SA_NOCHLDWAIT 子进程终止后不是僵尸进程
- sa_mask
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
static void hander(int s)
{
write(1,"*",1);
}
int main(void)
{
struct sigaction act,oact;
act.sa_handler = hander;
sigemptyset(&act.sa_mask);\\信号集
sigaddset(&act.sa_mask, SIGINT);
sigprocmask(SIG_BLOCK, &act.sa_mask, &oact.sa_mask);
act.sa_flags = 0;
sigaction(SIGINT,&act,&oact);
while(1)
;
exit(0);
}
- setitimer(2)
ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。
第二个参数指定间隔时间,第三个参数用来返回上一次定时器的间隔时间,如果不关心该值可设为NULL。- TIMER_REAL—>SIGALRM
- 指定时间间隔产生信号
- 最小时间单位微秒
- 流量控制
- 漏桶
- 令牌桶
本文主要参考UNIX环境高级编程第二版。