Linux内核信号量和定时器问题请教:
正在学习用户态线程和内核态定时器的使用,有个问题请教大家:
我在用户空间建立了一个线程,内核做一个字符驱动模块,通过ioctl调用来不断读取内核定时器有没有
到期。在设备结构体里面加了一个信号量,在open调用的时候把信号量拿到,使用一个内核定时器,在内
核定时器到期的处理函数里面释放信号量,这样用户线程调ioctl的时候就获取不到信号量了,等定时器
超时了,就会释放信号量,这样ioctl就返回到用户空间了,可是下次再调用ioctl的时候就不等待信号量了,不知道为什么??
不知道这样做行不行,看书上好像都是两个内核线程间用信号量来通信,请大家指教,谢谢!
void timer_handle(void)
{
int i = 0;
mod_timer(&KDA_devp->s_timer,jiffies + HZ * 5); /*重新改变定时器的超时时间*/
up(&KDA_devp->sem); /*释放信号量,ioctl调用可以获取到该信号量*/
}
int KDA_open(struct inode *inode, struct file *filp)
{
struct KDA_dev *dev; /* device information */
dev = container_of(inode->i_cdev, struct KDA_dev, cdev);
filp->private_data = dev; /* for other methods */
init_timer(&KDA_devp->s_timer);
KDA_devp->s_timer.function = &timer_handle;
KDA_devp->s_timer.expires = jiffies + HZ * 5;
add_timer(&KDA_devp->s_timer); /*添加(注册)定时器*/
down_interruptible(&dev->sem); /*获取信号量*/
return 0;
}
int KDA_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
int err = 0;
int isr_num = 100;
struct KDA_dev *dev = filp->private_data;
printk("want to get sem \n");
down_interruptible(&dev->sem);
switch(cmd)
{
case 1 :
printk("the case 1 \n");
break;
case 2 :
printk("the case 2 \n");
break;
case 3 :
__put_user(KDA_devp->ISR_flag, (int __user *)arg);
break;
default:
printk("the default case \n");
}
}