Unix/Linux 编程实践教程 第7章 笔记(1)

7.1 视频游戏和操作系统

1.视频游戏如何做?

  (1)空间:游戏必须的在计算机屏幕的特定位置画影像。

  (2)时间:影像以不同的速度在屏幕上移动。以一个特定时间间隔改变位置。

  (3)中断:用户可在任意时间产生输入。

  (4)同时做几件事:游戏必须保证几个物体移动的同时还要相应中断。

 

2.操作系统面临类似的问题

  (1)空间:内核将程序载入内存空间,并维护每个程序在内存中的位置。

  (2)时间:在内核的调度下程序以时间片间隔方式运行;

同时内核也在特定的时间运行特定的内部任务。

  (3)中断:内核必须在很短的时间内相应,用户和外设,在任意时刻的输入。

  (4)同时做几件事。

 

3.屏幕管理、时间、信号、共享资源

 (1)本章学习的4个基本主题:①屏幕管理;

②时间;

③信号(终断);

④如何安全的同时做几件事。

 (2)基于字符的图形界面。

 

7.2 编程任务:单人弹球游戏

1.游戏概要描述:(1)以一定的速度移动

             (2)遇到墙壁挡板会被弹回

              (3)用户按按钮来控制挡板上下移动

              目标:不让球飞出去。

 

2.三个要素:墙

球:屏幕上弹来弹去

挡板:用户控制

 

3.实现游戏要了解4个基本主题

①屏幕管理;

②时间;

③信号(终断);

④如何安全的同时做几件事。

-----------接下来依次学习这4个基本主题

 

 

                                 屏幕管理

7.3 屏幕编程:curses

1.curses库---可用它设置终端屏幕上显示的:光标的位置、字符样式。

2.大部分控制终端屏幕的程序,使用curses库。

 

7.3.1介绍curses

   1.curses将屏幕看成一个坐标网格。左上角为坐标原点。

    

   2.本章用得到的9个函数。

 

7.3.2虚拟和实际屏幕

1.Curses设置能够在不阻塞通信线路的情况下更新文本屏幕。

Curses通过虚拟屏幕来最小化数据流量。

 

2.真实屏幕:眼前的字符数组。

Curses保留了屏幕的两个内部版本:

内部屏幕:真实屏幕的复制

工作屏幕:纪录了对屏幕的改动(curses函数产生的改动)

                      工作屏幕就像磁盘缓存,大部分curses函数只对他修改。

3.refresh函数的工作原理

  (1)refresh比较真实屏幕和工作屏幕的差异,

然后通过终端驱动送出那些能使真实屏幕和工作屏幕一致的字符和控制码。

  (2)只传输改变的内容而不是影像本身,这种技术,被用在视频流中。

例如:真实屏幕左上角显示Smith James;addstr在工作屏幕相同位置显示 Smith Jane

refresh只是用n和空格替换m和s。

时间

7.4时钟编程: sleep()

游戏需要把影像在特定的时间置于特定的位置:(1)用curses把影像置于特定的位置。

                                          (2)然后在程序中添加相应的时间。

 

 

静态显示:

hello1.c在屏幕上显示一个字符串(hello,world)

hello2.c自上而下逐行显示,背景交替反色,每次x左后向后移动一个单位。

 

动画显示:

hello3.c 在2的基础上,每秒加一行。

hello4.c在2的基础上,每秒加一行,之前一行被空白覆盖。(沿着对角线缓慢向右下角移动)

hello5.c字符串在某一行,左后墙弹来弹去

 

 

 

7.5时钟编程1Alarms-----时钟和高级信号编程

时钟的作用:1、在执行流中加入时延。------------------调用sleep  (7.5.1和7.5.2)

                2、调度一个将来某一刻要做的任务.-----调用alarm  (7.5.3)

 

7.5.1sleep函数:添加时延

    unsigned sleep( unsigned seconds );

    功能:第一步:调用sleep(),进程被挂起。

            第二步:满足①②之一进程被唤醒:

①挂起后经过seconds秒。

                    ②在seconds之内,进程捕捉到一个信号并从处理程序返回。

             第三步:进程继续执行。

 

      返回值:①返回0

②返回(seconds – 实际休眠时间)

 

 

 

7.5.2  alarm() + pause()可实现:sleep()的功能

    1.原理:系统中的每一个进程都有一个私有的闹钟

这个闹钟设置一个时间(用alarm设置)。

时间一到,时钟就发送一个信号SIGALRM都进程。

除非SIGALRM用signal()设置了处理函数,否则信号将杀死这个进程。

 

2.sleep()函数由3个步骤组成:

(1)为SIGALRM设置一个处理函数(调用signal())。

(2)调用alarm(seconds):设置一个闹钟----seconds秒给进程发送SIGALRM信号。    

(3)调用pause():      挂起进程直到信号到达。

      实现了:进程被挂起。

seconds秒后接收到信号(SIGALRM),执行处理函数返回后,pause返回。

进程被唤醒。

----------------------------------------------------------------------------------------------------------------------以下:闹钟 = 计时器 (#include<unistd.h>)

1.unsigned old = alarm( unsigned seconds );

  功能:给进程设置一个闹钟时间:到seconds秒后,内核发送SIGALRM出到这个进程。

  返回:成功:如果调用此alarm()前:

进程已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间

进程没有设置闹钟时间,  则返回0
      出错:-1

  解释

(1)对信号的处理:如果忽略或者不捕获:按默认处理,终止调用该alarm函数的进程。

       ①捕获:用signal函数。

       ②不捕获:不做任何处理。

       ③忽略:捕获了但是按照默认处理,没使用处理函数做特别的处理。

  

 (2)一个进程只能有一个闹钟时间。

如果在调用alarm之前,已设置过闹钟时间,而且它尚未超时:

则任何以前的闹钟时间都被新值所代替。(之前的闹钟时间不作数了只按现在的处理)alarm返回上次闹钟时间的余留值。

注意:若seconds = 0,即新闹钟时间为0,意味着闹钟被关闭了。

 

2.result = pause();

 功能:挂起进程直到一个信号到达。

 返回:(1)调用进程被这个信号终止。pause没有返回值。

     (2)用signal捕获,并从处理函数返回后,pause返回。Errno设置为EINTR

 

----------------------------------------------------------------------------------------------------------

7.5.3  调度将要发生的动作

计时器的另一个用途:调度一个在将来某刻发生的动作,同时做其他事情。

实现:通过alarm设置计时器,然后做别的事。

当计时器时间到时信号发送,处理函数被调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值