}
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);
}
static unsigned int globalvar_poll(struct file *filp, poll_table *wait)
{
unsigned int mask = 0;
poll_wait(filp, &outq, wait);
if(flag != 0)
{
mask |= POLLIN | POLLRDNORM;
}
return mask;
}
module_init(globalvar_init);
module_exit(globalvar_exit);