现在的位置: 首页 > 综合 > 正文

wait_event_interruptible wake_up_interruptible 小例子

2013年09月07日 ⁄ 综合 ⁄ 共 1162字 ⁄ 字号 评论关闭

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/wait.h>
#include <asm/uaccess.h>

unsigned int globalvar = 0;
wait_queue_head_t myqueue;
unsigned int flag = 0;

int myread(struct file *fl, char *buf, size_t size,loff_t *loff)
{
    wait_event_interruptible(myqueue, flag != 0);
    if(copy_to_user(buf,&globalvar,sizeof(int)))
    {
    printk("copy to user failed/n");
    return -EFAULT;
    }
    flag = 0;
    return sizeof(int);
}

int mywrite(struct file *fl, char *buf, size_t size, loff_t *loff)
{
    if(copy_from_user(&globalvar, buf,sizeof(int)))
    {
    printk("copy from user failed/n");
    return -EFAULT;
    }
    wake_up_interruptible(&myqueue);
    flag = 1;
    return sizeof(int);
}

static const struct file_operations fops = {
    .read  = myread,
    .write = mywrite
};

static int mod_init()
{
    int ret;
    ret = register_chrdev(133, "mychar", &fops);
    if(ret < 0)
        printk("<0>""register char dev failed/n");
    init_waitqueue_head(&myqueue);
    return 0;
}

static void mod_exit()
{
    unregister_chrdev(133,"mychar");
}

module_init(mod_init);
module_exit(mod_exit);

 

这个东西作用就是一边没wake_up_interruptible和改变flag标志时, 那么另一边就等在wait_event_interruptible。和completion的区别不知道,因为就是这里边也有调度schedule,可以让出处理器,completion里也有调度。

抱歉!评论已关闭.