信号的特点是简单、携带的信息量少,且使用在某个特定的场景中。信号有产生、未决以及递达三种状态。
1.信号相关的函数:
- kill ---发送信号给指定的进程
- raise----给自己发送信号
函数原型: int raise(int sig);
- abort---给自己发送异常终止信号
函数原型 :void abort(void); 没有返回值,永远不会调用失败
- 闹钟(定时器)
alarm---设置定时器(每个进程只有一个定时器)
函数原型:unsigned int alarm(unsigned int seconds); 参数为秒,当时间到达之后,函数发出一个SIGALRM信号。
2.相关函数示例
kill函数原型 int kill(pid_t pid,int sig);第一个参数表示给哪个pid发信号,第二个表示发什么信号。成功返回值为0,失败返回值为-1。其中,信号的类型有:
alarm:表示定时几秒然后触发信号:
setitimer表示实现周期性定时
主要就是设置itimerval结构体,设置第一次触发的时间,以及循环的时间。
3.信号集
前面说了信号有三种状态,处于未决状态的信号则存放在未决信号集中,处于阻塞状态的信号则存放在阻塞集中。
前面kill函数中,展示了信号的类型,每个信号前面都有一个标号与之对应,该标号也是该信号在信号集中的地址,如果在未决信号集中的值为1,则表示信号处于未决状态,为0表示递达状态,阻塞集也是一样。
由于未决信号集与阻塞信号集在内核pcb中,内核是不能操作的,只有用户区可以修改的,所以内核提供了一系列的接口函数,先自定义一个自定义信号集,结构与阻塞信号集是一样的,先把自定义信号集修改好,然后利用借口函数赋值给阻塞信号集。
4.信号捕捉
给一个sigaction示例:
在信号处理过程中,才会临时对ctrl+alt+\屏蔽,信号处理完以后(打印wake up),就不屏蔽了,程序就终止了。
最后,再给两个利用定时器加信号捕捉实现的定时打印功能:
这里的函数跟上面的功能差不多,定时器信号捕捉以后,再定义一个定时器。