信号

信号相关概念

产生信号

  1. 硬件异常产生

除以0 ----> 8)SIGFPE(浮点数列外) float
非法访问内存 ----> 11)SIGSEGV(段错误)
总线错误 ----> 7)SIGBUS

  1. 按键产生

Ctrl + c ----> 2)SIGINT (终止,中断) interrupt
Ctrl + z ----> 20)SIGTSTP(暂停,停止) terminal
Ctrl + \ ----> 3)SIGQUIT (退出)

  1. 命令产生
  2. 软件条件产生
  3. 系统调用产生

概念

未决:产生与递达之间的状态
递达:产生并且送达的进程,直接被内核处理掉。
信号处理方式:默认,忽略,捕捉

阻塞信号集(信号屏蔽字):本质,位图。记录信号的屏蔽状态,设置为屏蔽状态的信号在解除屏蔽之前,一直处于未决状态。
未决信号集:本质,位图。用来记录信号的处理状态。

信号的四要素

编号 名称 对应事件 默认处理动作

函数

alarm
unsigned int alarm(unsigned int seconds)
//参数:seconds定时秒数
//返回值:上次定时时间,无错误现象
time

time命令,查看程序执行时间。 实际时间 = 用户时间 + 内核时间 + 等待时间

kill
int kill(pid_t pid, int signal)   //成功0,;失败-1,设置errno
/*
参数:pid
大于0:发送信号给指定的进程
等于0:发送信号给调用kill函数的那个进程,处于同一组的进程
小于-1:取绝对值,发送信号给绝对值对应进程组的所有成员
等于-1:发送信号给,有权发送的所有进程
*/
setitimer函数
int setitimer(int which, const struct itimerval *new_value,  struct itimerval *old_value) //成功0;失败-1,设置errno
/*
参数:
	which
ITIMER_REAL  自然计时法  ----- SIGALRM
ITIMER_VIRTUAL 用户空间计时 ----- SINGVTALRM
ITIMER_PROF  内核+用户空间计时 -----SIGPROF
	itimerval
struct itimerval{
	struct timeval it_interval;
	struct timeval it_value;
}
struct timeval{
	time_t  tv_sec;
	suseconds_t tv_usec;
}
*/

信号集操作函数

信号集的设置
sigset_t set;
int sigemptyset(sigset_t *set);    //将某个信号集清0     成功0;失败-1设置errno
int sigfillset(sigset_t *set);     //将某个信号集置1
int sigaddset(sigset_t *set,int signum);  //将某个信号加入信号集
int sigdelset(sigset_t *set,int signum); //将某个信号清除信号集
int sigismember(const sigset_t *set,int signum);  //判断某个信号是否在信号集中  在1,不在0;失败-1设置errno
读取修改信号屏蔽字
int sigprocmask(int how,const sigset_t *set,sigset_t *oldset);  //成功0;失败-1,设置errno
/*
参数
oldset:传出参数,保存旧的信号屏蔽字
how:	SIG_BLOCK:当how为此值时,set表示需要屏蔽的信号。mask = mask|set
		SIG_UNBLOCK:当how为此值时,set表示需要解除的信号。 mask = mask & ~set
		SIG_SETMASK:当how为此值时,set表示用于替换的新的屏蔽字。 mask = set
*/
读取未决信号集
int sigpending(sigset_t *set);    //成功0;失败-1,设置errno

信号捕捉

signal函数
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum,sighandler_t handler);
//该函数有ANSI定义,由于历史的原因在不同版本的UNIX和不同的Linux中可能有不同的行为。
//因此应该尽量避免使用,取而代之 sigaction() 函数
sigaction函数
int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact)  //成功0;失败-1,设置errno
/*
参数:
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_IGN (忽略) 或 SIG_DFL 表执行默认动作
sa_mask:信号屏蔽字,仅在处理函数被调用期间屏蔽生效
sa_flags:通常设置0,表示默认属性
*/

信号捕捉的特性:

  1. 信号捕捉函数执行期间,屏蔽字有 mask —> sa_mask,捕捉函数结束后,恢复为mask。
  2. 信号捕捉函数执行期间,本信号自动被屏蔽(sa_flags = 0)。
  3. 信号捕捉函数执行期间,被屏蔽信号多次发送,解除屏蔽后只执行一次。

总结

  1. 发送信号 killalarmsetitimer
  2. 设置信号集 (empty,fill,add,del,ismember)
    修改信号屏蔽字(sigprocmask)
    读取未决信号集(sigpending)
  3. 信号捕获的特性。(3)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值