Key-word: setitimer,getitimer, signal, sigaction, 计时器,信号处理
一、内容概要
本章任务:完成单人弹球游戏
先用curses库编写“hello,world”,然后用sleep()实现动画效果。
Sleep() make the calling thread sleep until secondshave elapsed or a signal arrived that is not ignored.
1、计时器
用alarm 和 pause 函数实现sleep()功能。Pause()挂起进程知道一个信号到达。Alarm设置本进程的计时器到达seconds秒后激发SIGALRM信号。
间隔计时器(interval timer)。与alarm相比,更复杂的计时功能,用getitimer, setitimer配置。Interval timer可以以更高的精度控制计时器不间断的发送SIGALRM信号。
计时器总是用来定时发送SIGALRM。
2、信号处理
Chapter 6介绍了用signal()处理信号,本章介绍了更复杂的signacton()处理信号。Signaction不仅可以指定信号处理函数,还可以指定是否阻塞某个信号的处理等。
后面的游戏代码中只用到了signal。
3、阻塞信号
专门的配置进程是否阻塞某信号的函数:sigprocmask。阻塞信号通常是为了防止数据损毁。
配置进程的阻塞信号属性可以使用signaction和sigprocmask。
Sigprocmask在后面的游戏代码中也没有用到。
4、弹球游戏
用interval timer不间断差生SIGALRM信号,用signal处理信号,触发信号处理接口,控制弹球的位置和实现动画效果。
用while(1)循环和getchar实现对键盘输入的监控,控制弹球的速度和方向。
5、异步输入
无需用while(1)和getchar阻塞的监听键盘,而是键盘有键按下时,产生SIGIO信号。
简要介绍了实现异步输入的两种方法:文件描述块的O_ASYNC和POSIX标准的aio_read。
总的来说,本章介绍了如何用计时器产生信号、对信合(不同信号、单个/多个信号)的处理。