欢迎转载,请注明原处,版权个人所有,不得用于商业用途,违者将追求起法律责任。 chengyaogen.blog.chinaunix.net
前面一节,我们在屏幕上画出了俄罗斯方块,现在我们让它动起来,呵呵,动起来...
思想就是通过改变x,y的坐标,在屏幕的不同地方绘制图形。
方法是通过方向键(A S D W)来改变x,y的坐标。
先来看看shell中的信号处理吧
一、trap捕捉到信号之后,可以有三种反应方式
(1)执行一段程序来处理这一信号
(2)接受信号的默认操作
(3)忽视这一信号
二、trap对上面三种方式提供了三种基本形式
第一种形式的trap命令在shell接受到signal list清单中数值相同的信号时,将执行双引号中的命令串。
trap 'commands' signal-list
trap "commands" signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽视信号
trap "" signal-list
注意:
(1)对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储
(2)在trap中可以定义对信号0的处理(实际上没有这个信号),shell程序在其终止(如执行exit语句时) 发出该信号
(3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令
另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若commands是单引号括起来的话,那么shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体的值来替换。
- #!/bin/bash
- SigA=20
- SigS=21
- SigD=22
- SigW=23
- sig=0
- function Register_Signal()
- {
- trap "sig=$SigA;" $SigA
- trap "sig=$SigS;" $SigS
- trap "sig=$SigD;" $SigD
- trap "sig=$SigW;" $SigW
- }
- function Recive_Signal()
- {
- Register_Signal
- while true
- do
- sigThis=$sig
- case "$sigThis" in
- "$SigA")
- echo "A"
- sig=0
- ;;
- "$SigS")
- echo "S"
- sig=0
- ;;
- "$SigD")
- echo "D"
- sig=0
- ;;
- "$SigW")
- echo "W"
- sig=0
- ;;
- esac
- done
- }
- function Kill_Signal()
- {
- local sigThis
- while :
- do
- read -s -n 1 key
- case "$key" in
- "W"|"w")
- kill -$SigW $1
- ;;
- "S"|"s")
- kill -$SigS $1
- ;;
- "A"|"a")
- kill -$SigA $1
- ;;
- "D"|"d")
- kill -$SigD $1
- ;;
- "Q"|"q")
- kill -9 $1
- exit
- esac
- done
- }
- if [[ "$1" == "--show" ]]
- then
- Recive_Signal
- else
- bash $0 --show &
- Kill_Signal $!
- fi
这段shell脚本的功能是:按下A S D W键会打印出对应的字母,按下 Q键退出
阅读(8318) | 评论(0) | 转发(20) |