前面一节,我们在屏幕上画出了俄罗斯方块,现在我们让它动起来,呵呵,动起来...
思想就是通过改变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
代码如下: