- 论坛徽章:
- 0
|
5可用积分
大家好,我做了一个挺简单实现异步通知的驱动函数。
已经可以实现异步通信了,可是好像只有用户空间进行完一次IO之后才能发出一个异步信号。
我是想在ioctl函数中,每隔2秒发出一个异步通知。可是没有实现,只有最后一次实现了。
大家帮忙看看怎么回事呢???
用户空间主函数:
void write_to_file_test(int signum)
{
printf("get data!\n");
}
int main()
{
fd = open("/dev/kpp",O_RDWR);
if(fd==-1)
{printf("open device %serror\n","TEST");
}
else{
printf("fd=%d\n",fd);
signal(SIGIO,write_to_file_test);
fcntl(fd,F_SETOWN,getpid());
oflags = fcntl(fd,F_GETFL);
fcntl(fd,F_SETFL,oflags|FASYNC);
char *inin = "hello";
sleep(3);
ioctl(fd,1);
printf("ioctl after!\n");
}
while(1);
}
驱动中各主要实现函数:
主要结构体:
struct globalfifo_dev{
struct cdev cdev; /*cdev结构体*/
struct fasync_struct *async_queue;/*异步结构体指针,用于读 */
};
struct globalfifo_dev *uspi_devp_1;
1、static int uspi_open(struct inode *inode, struct file *filp)
{
filp->private_data = uspi_devp_1;
return 0;
}
2、static int uspi_release(struct inode *inode, struct file *filp)
{
uspi_fasync(-1,filp,0);
return 0;
}
3、static int uspi_fasync(int fd,struct file *filp,int mode)
{
struct globalfifo_dev *dev = filp->private_data;
return fasync_helper(fd, filp, mode, &dev->async_queue);
}
4、static void register_uspi(void)
{
devno = MKDEV(KPPMAJOR, 0);
register_chrdev_region(devno, 1, MODULE_NAME);
uspi_devp_1 = kmalloc(sizeof (struct globalfifo_dev), GFP_KERNEL);
memset( uspi_devp_1, 0, sizeof (struct globalfifo_dev));
devno_1= MKDEV(KPPMAJOR, 0);
cdev_init(& uspi_devp_1->cdev, &uspi_ops);
uspi_devp_1->cdev.owner = THIS_MODULE;
uspi_devp_1->cdev.ops = &uspi_ops;
cdev_add(& uspi_devp_1->cdev, devno_1, 1);
}
5、static int uspi_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,unsigned long arg)
{
uspi_devp_1 = filp->private_data;
if(uspi_devp_1->async_queue)
kill_fasync(&uspi_devp_1->async_queue,SIGIO,POLL_IN);
printk("haoaoha\n");
mdelay(2000);
if(uspi_devp_1->async_queue)
kill_fasync(&uspi_devp_1->async_queue,SIGIO,POLL_IN);
printk("haoaoha1111111111\n");
mdelay(2000);
if(uspi_devp_1->async_queue)
kill_fasync(&uspi_devp_1->async_queue,SIGIO,POLL_OUT);
printk("haoaoha2222222222222\n");
mdelay(2000);
if(uspi_devp_1->async_queue)
kill_fasync(&uspi_devp_1->async_queue,SIGIO,POLL_IN);
printk("haoaoha333333333333\n");
return 0;
}
程序编译没有问题,可是就是不能及时的发出异步通知信号!不知道为什么? |
|