Jan 12 2016

工作队列wait queue() wait_event() interruptible_sleep_on()等应用方法

首页 » 渗透编程 » 工作队列wait queue() wait_event() interruptible_sleep_on()等应用方法   

在Linux驱动程序中,可以使用等待队列(wait queue)来实现阻塞进程的唤醒。wait queue很早就作为一种基本的功能单位出现在Linux内核里了,它以队列位基础数据结构,与进程调度机制紧密结合,能够用于实现内核中异步事件通知机制。等待队列可以用来同步对系统资源的访问。(信号量在内核中也依赖等待队列来实现)。
    Linux-2.6提供如下关于等待队列的操作:
    (1) 定义"等待队列头"

        wait_queue_head_t my_queue;


    (2) 初始化"等待队列头"
        init_waitqueue_head(&my_queue);
        定义和初始化的快捷方式:
        DECLARE_WAIT_QUEUE_HEAD(my_queue);   


    (3) 定义等待队列
        DECLARE_WAITQUEUE(name, tsk);
        定义并初始化一个名为name的等待队列(wait_queue_t);


    (4) 添加/移除等待队列
        void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
        void fastcall remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
        add_wait_queue()用于将等待队列wait添加到等待队列头q指向的等待队列链表中,而remove_wait_queue()用于将等待队列wait从附属的等待队列头q指向的等待队列链表中移除。


    (5) 等待事件
        wait_event(queue, condition);
        wait_event_interruptible(queue, condition);
        wait_event_timeout(queue, condition, timeout);
        wait_event_interruptible_timeout(queue, condition, timeout);
        等待第一个参数queue作为等待队列头的等待队列被唤醒,而且第二个参数condition必须满足,否则阻塞。wait_event()和wait_event_interruptible()的区别在于后者可以被信号打断,而前者不能。加上timeout后的宏意味着阻塞等待的超时时间,以jiffy为单位,在第三个参数的timeout到达时,不论condition是否满足,均返回。


    (6) 唤醒队列
        void wake_up(wait_queue_head_t *queue);
        void wake_up_interruptible(wait_queue_head_t *queue);
        上述操作会唤醒以queue作为等待队列头的所有等待队列对应的进程。
        wake_up()               <--->    wait_event()
                                         wait_event_timeout()
        wake_up_interruptible() <--->    wait_event_interruptible()   
                                         wait_event_interruptible_timeout() 

        wake_up()可以唤醒处于TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE的进程
        wake_up_interruptble()只能唤醒处于TASK_INTERRUPTIBLE的进程。


    (7) 在等待队列上睡眠
        sleep_on(wait_queue_head_t *q);
        interruptible_sleep_on(wait_queue_head_t *q);
      
        sleep_on()函数的作用就是将当前进程的状态置成TASK_UNINTERRUPTIBLE,定义一个等待队列,并把它添加到等待队列头q,直到支援获得,q引导的等待队列被唤醒。
        interruptible_sleep_on()与sleep_on()函数类似,其作用是将目前进程的状态置成TASK_INTERRUPTIBLE,并定义一个等待队列,之后把它附属到等待队列头q,直到资源可获得,q引导的等待队列被唤醒或者进程收到信号。   

        sleep_on()               <--->   wake_up() 

        interruptible_sleep_on() <--->   wake_up_interruptible()

与(5)的区别是不需要condition参数,只有调用wake_up()或wake_up_interruptible()就唤醒队列上的所有等待

如果您喜欢本博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容:

正文部分到此结束

文章标签:这篇文章木有标签

版权声明:若无特殊注明,本文皆为( mOon )原创,转载请保留文章出处。

也许喜欢: «xss开源平台(无需sql版) | (C#)使用队列(Queue)解决简单的并发问题»

你肿么看?

你还可以输入 250/250 个字

微笑 大笑 拽 大哭 亲亲 流汗 喷血 奸笑 囧 不爽 晕 示爱 害羞 吃惊 惊叹 爱你 吓死了 呵呵

评论信息框

这篇文章还没有收到评论,赶紧来抢沙发吧~

友情链接:万达主管  万达娱乐主管  万达注册  guoqibee.com  万达娱乐直属QQ  万达娱乐注册  万达登录  万达娱乐招商  测试  万达娱乐平台