1查看信号的方式:man
7 signal,通过这个命令可以查看到所有信息。
2查看信号kill
-l
注意,后面的32个信号表示的实时信号。
会发现一个规律,前32种信号会有各种不同的名称,后32种会以“SIGRTMIN”或者“SIGRTMAX”开头,前者是从unix继承下来的信号,称为不可靠信号(也称为非实时信号),后者为了解决“不可靠信号”的问题进行了更改和扩充的信号形成了可靠信号(也称为实时信号)
如果想要了解可靠与不可靠信号,需要了解信号的生命周期:
一个完整的信号周期可以分为三个重要阶段,三个重要阶段有四个重要事件刻画的:信号产生,信号在进程中注册,信号在进程中注销,执行信号处理函数
相邻的两个事件的时间间隔构成了生命周期的一个阶段,这里的信号处理有多种方式,一般由内核完成,也可以由用户进程完成
3.man 7 signal
Signal dispositions
Each signal has a current disposition,which determines how the process
behaves when it is delivered the signal.
The entries in
the "Action" column of thetables below specify the
default disposition for each signal, asfollows:
Term Default action is to terminate the process.
表示终止当前线程
Ign Default action is to ignore the signal.
表示忽略该信号
Core Default action is to terminate the process and
dump core (see
core(5)). 表示终止当前进程并且Core Dump(Core Dump用于gdb调试)
Stop Default action is to stop the process.
表示停止当前进程
Cont Default action
is to continue the process if it iscurrently
stopped. 表示继续执行先前停止的进程。
信号产生种类:
Ctrl+C
SIGINT
Ctrl+z
SIGTSTP
Ctrl+\
SIGQUIT
4.硬件异常
*除0操作
*访问非法内存
int kill(pid_tpid,int sig)
pid > 0
sig发送给ID为pid的进程
pid < 0
sig发送给组ID为|pid|的进程,并且发送进程具有向其发送信号的权限
pid == -1
sig发送给发送进程有权限向他们发送信号的系统上的所有进程为0时,用于检索,特定pid进程是否存在,如不存在,返回-1
kill函数的语法格式:
raise()函数(自己向自己发送信号)语法要点:
下面的例子使子进程不在父进程调用kill之前不退出,然后父进程调用kill使子进程退出:
运行结果:
当去掉24行时,运行的结果是:
5.alarm()、pause()
函数说明
alarm()也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它就向进程发送SIGALARM信号。要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm()之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。
pause()函数用于将调用进程挂起直至捕捉到信号为止。这个函数很常用,通常可以用于判断信号是否已到。
函数格式
本实验上是完成一个简单的sleep()函数的功能,程序如下图
运行结果:
注释第9行
运行结果:
上面一闪而得出结果。
分析:程序定时时,执行到第9行pause()时,进程会被挂起,当计时到,发送信号SIGALARM,这时pause()捕捉到信号,进程直接被终止。
再如通过alarm实现打印计数:
运行结果: