Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9396083
  • 博文数量: 1747
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20060
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1747)

文章存档

2024年(23)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: LINUX

2010-11-23 10:04:23

  1. 休眠
    • 在原子上下文中不能休眠。(持有自旋锁/seqlock/RCU时)
    • 被激活时不能确定到底休眠了多久,所以被激活后应当再次检查程序等待的条件。
    • 确认自己休眠后能被正确的激活。
  2.  休眠的实现
    • 等待队列。 一个进程的列表, 列表中所有的进程都等待一个特定的事件。
    •  
    • DECLARE_WAIT_QUEUE_HEAD(等待队列名 queue-name)
      wait_queue_head_t my_queue;
      init_waitqueue_head(&my_queue);
  3.  休眠API
    • wait_event(my_queue, condition)  //queue是值参, 等待直到conditon为真
      wait_event_interruptible(my_queue, condition)//当前进程可被中断,返回>0表示被中断了。
      wait_event_timeout(my_queue, condition, timeout) //超时后返回0
      wait_event_interruptible_timeout(my_queue, condition, timeout)
    • void wake_up(&my_queue) //是地址参量,唤醒所有队列上的进程
      void wake_up_interruptible(&my_queue); //唤醒一个可中断的休眠
    • 范例.(此范例存在多进程竞争的情况,因为flag是公共变量)

static DECLARE_WAIT_QUEUE_HEAD(wq);
static int flag = 0;

ssize_t sleepy_read(struct file *filp, char __user *buf, size_t count, loff_t *pos)
{
    printk(KERN_DEBUG, "process %i (%s) going to sleep \n",  

            current->pid, current->comm);
    wait_event_inpterruptible(wq, flag != 0);
//此时进程进入休眠,

                                              //直到flag != 0 成立
    flag = 0
    printk(KERN_DEBUG, "awoken %i(%s) \n", current->pid,

            current->comm);
    return 0;
}

ssize_t sleepy_write(struct *filp, const char __user *buf, size_t count, loff_t *pos)
{
    printk(KERN_DEBUG, "process %i (%s) awakening reader ...\n",

            current->pid, current->comm);
    flag = 1;
    wake_up_interruptible(&wq);
    return count;
}








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