Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59075
  • 博文数量: 32
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 325
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-28 21:50
文章分类

全部博文(32)

文章存档

2011年(1)

2010年(6)

2009年(25)

我的朋友

分类: LINUX

2009-12-09 21:56:07

  • 屏幕编程:curses库        #include
    curses库是一组函数,是一组对屏幕进行编程的函数。
    curses库初始化后,终端屏幕就成为curses screen,对curses screen的设置可以有无回显,无字符缓冲等,类似于对终端驱动程序的设置

  • 时钟编程
    1.alarm()
    sleep(n)            #include
    将当前进程挂起n秒或者在此期间被一个不能忽略的信号到达所唤醒
    sleep函数工作原理:
      signal(SIGALRM,handler);
      alarm(n);       //n秒后发送信号SIGALRM
      pause();        //挂起当前进程,直到任何一个不能忽略信号到达
    alarm()设置本进程的计时器n秒后激发信号SIGALRM,如果计时器已经被设置,alarm()返回剩余秒数,alarm(0)意味关闭计时器

    2.间隔计时器(比sleep更精确,包含usleep,微秒)
    包含初始间隔和重复间隔,每个间隔由秒数和微秒数组成
    getitimer(),setitimer()
    取得或设置间隔计时器,是通过struct itimerval来完成的。
    计时器分为三种:
    真实(进程运行的全部时间)
    虚拟(进程在用户态的时间)
    实用(进程在用户态加内核态的时间)

    计时器小结:
    内核只有一个系统时钟脉冲,当收到一个时钟脉冲,内核将会使所有的计时器减一个时钟单位
    一个Unix程序用计时器来挂起执行和调度将要采取的动作,计时器是内核的一种机制,内核通过它在一定的时间之后向进程发送SIGALRM。(实际上可以发送任何信号)

  • 信号处理
    1.使用signal()   #include
    属于早期的信号处理机制,有三种处理方法(忽略,默认,调用函数)
    缺点:
    调用handler只能获得信号的编号,无法得到关于信号的多种信息
    调用处理函数中不能安全地阻塞其他信号


    2.Posix标准:使用sigaction()    #include
    通过struct sigaction来进行信号处理,可以获得信号的编号及其多种信息,还能处理多个信号,安全地进行阻塞其他信号

    3.临界区的概念
    需要原子操作的代码区

    4.阻塞信号
    第一种:在信号处理函数中设置,通过设置struct sigaction中的sa_mask位,阻塞在调用处理函数时的其他信号
    第二种:在进程中设置,通过sigprocmask()设置进程的阻塞信号集,这个信号集称为信号挡板
    以上的两种阻塞信号集都可以通过sigsetops()来进行构造

    5.重入代码
    在临界区操作中,可重入函数是指在被调用时能够不引起任何问题的信号处理函数,如果函数不是可重入的,那么信号就必须被阻塞。

    6.kill() 向一个进程发送信号
    #include
    #include
    int kill( pid_t pid, int sig )

  • 异步I/O
    一个很重要的概念,在进行I/O时,异步I/O使得进程可以无须阻塞而得到用户的I/O,进程可以要求内核在得到输入时发送信号通知
    Unix有两个异步输入系统:
    1.UCB通过fcntl设置文件描述符的O_ASYNC位来实现
    2.Posix标准通过调用aio_read(),struct aiocb来实现
    #include
    aio_read()

  • 本章出现的重要系统调用和数据结构
    (1)alarm、setitimer、getitimer
    (2)kill、pause
    (3)sigaction、sigprocmask
    (4)fcntl、aio_read

阅读(1174) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~