-
信号共性
简单、不能携带大量信息、满足条件才发送。 -
信号特质
信号是软件层面的“中断”,一旦信号产生,正在执行的程序必须停止,处理信号,结束后继续执行程序;
信号的产生和处理是由 内核 完成的。 -
信号产生方式:
1、按键产生;2、系统调用;3、软件条件产生;4、硬件异常;5、命令产生 -
相关概念
1、未决:产生于递达之间的状态;
2、递达:产生并送达进程,直接被内核处理;
3、信号处理方式:执行默认处理动作、忽略、捕捉(自定义)
4、阻塞信号集(信号屏蔽字):本质:位图,用于记录信号的屏蔽状态,一旦信号被屏蔽,解除屏蔽前,信号将一直处于未决态。
5、未决信号集:本质:位图,用于记录信号的处理状态,该信号集中的信号,表示已经产生但尚未被处理。 -
信号四要素
信号使用前应先确定信号四要素。
信号编号、信号名称、信号对应事件、信号默认处理动作。
9)SIGKILL:无条件终止进程。本信号不能被忽略、处理和阻塞。默认动作为终止进程。向系统管理员提供了杀死任何进程的方法。
19)SIGSTOP:停止进程执行,信号不能被忽略、处理和阻塞。默认动作暂停进程
- kill命令和kill函数
int kill(pid_t pid, int signum)
pid:
大于0: 发送信号给指定进程
等于0: 发送信号给跟调用kill函数的那个进程出于同一进程组的进程
小于-1:取绝对值,发送信号给该绝对值所对应的进程组的所有组员
等于-1:发送信号给有权限发送的所有进程
- alarm函数
每个进程有且只有一个定时器。
定时发送SIGALARM给当前进程。
使用自然计时法。
unsigned int alarm(unsigned int seconds);
seconds:定时秒数
返回值:上次定时剩余时间,无错误现象。
time 命令:查看程序执行时间。实际执行时间=用户时间+内核时间+等待时间–》优化瓶颈:IO。
- setitimer函数
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
which为定时器类型,setitimer支持3种类型的定时器:
ITIMER_REAL: 以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL: 以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF: 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。
new_value:定时秒数
itimerva类型:struct itimerval {
struct timeval it_interval; /* Interval for periodic timer /
struct timeval it_value; / Time until next expiration /
};
struct timeval {
time_t tv_sec; / seconds /
suseconds_t tv_usec; / microseconds */
};
it_interval指定间隔时间,it_value指定初始定时时间。如果只指定it_value,就是实现一次定时;如果同时指定 it_interval,则超时后,系统会重新初始化it_value为it_interval,实现重复定时;两者都清零,则会清除定时器。
eg:
struct itimerval new_t;
struct itimerval old_t;
new_t.it_interval.tv_sec=1;
new_t.it_interval.tv_usec=0;
new_t.it_value.tv_sec=0;
new_t.it_value.tv_usec=0;
setitimer(&new_t, &old_t);old_value:传出时间,上次剩余时间;
返回值:成功:0;失败:-1