#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里也有调度。