| 
              if (ret)  {   printk("globalvar unregister failure");  }  else  {   printk("globalvar unregister success");  } }
  static ssize_t globalvar_read(struct file *filp, char *buf, size_t len, loff_t *off) {  //等待数据可获得  if (wait_event_interruptible(outq, flag != 0))  {   return - ERESTARTSYS;  }
   if (down_interruptible(&sem))  {   return - ERESTARTSYS;  }
   flag = 0;  if (copy_to_user(buf, &global_var, sizeof(int)))  {   up(&sem);   return - EFAULT;  }  up(&sem);  return sizeof(int); }
  static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len,loff_t *off) {  if (down_interruptible(&sem))  {   return - ERESTARTSYS;  }  if (copy_from_user(&global_var, buf, sizeof(int)))  {   up(&sem);   return - EFAULT;  }  up(&sem);  flag = 1;  //通知数据可获得  wake_up_interruptible(&outq);  return sizeof(int); }
  module_init(globalvar_init); module_exit(globalvar_exit); 
             | 
         
    
 
  编写两个用户态的程序来测试,第一个用于阻塞地读/dev/globalvar,另一个用于写/dev/globalvar。只有当后一个对/dev/globalvar进行了输入之后,前者的read才能返回。 
  读的程序为: 
		    
                      
		      
		      
		   |