#include #include #include #include #include #include #include #include wait_queue_head_t select_wait;
static int num=1;
void hello()
{
int val=0;
while(1){
printk("ddddd\n");
schedule_timeout_uninterruptible(100);
val = wait_event_interruptible_timeout(select_wait,num,20000);
printk("fffff\n");
num=0;
if (val==0)
printk("val ==0\n");
else
printk("val =%d\n",val);
}
}
void ok()
{
printk("0k\n");
while(1){
schedule_timeout_uninterruptible(400);
if(waitqueue_active(&select_wait)){//其实这个if语句直接用num =1,就行。wake_up_interruptibe(&select_wait)感觉没有效果。
num=1;
wake_up_interruptible(&select_wait);
printk("wake up\n");
}
}
}
int HS_init(void)
{
init_waitqueue_head(&select_wait);
int res = 0;
printk(KERN_ALERT "Hello ...\n");
kernel_thread(hello,NULL,CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
kernel_thread(ok,NULL,CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
return res;
}
void HS_exit(void)
{
num=0;
printk(KERN_ALERT "Bye ...\n");
}
static int __init hsdrv_init(void)
{
printk(KERN_ALERT " driver loading ...\n");
return HS_init();
}
static void __exit hsdrv_exit(void)
{
printk(KERN_ALERT "HS driver unloaded.\n");
HS_exit();
}
MODULE_LICENSE("GPL");
module_init(hsdrv_init);
module_exit(hsdrv_exit);