} 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);
|