+ -
当前位置:首页 → 问答吧 → 异步通知引起的问题!

异步通知引起的问题!

时间:2009-01-02

来源:互联网

大家好,我做了一个挺简单实现异步通知的驱动函数。
已经可以实现异步通信了,可是好像只有用户空间进行完一次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;
        
}
程序编译没有问题,可是就是不能及时的发出异步通知信号!不知道为什么?      

作者: xiabeizi   发布时间: 2009-01-02

引用:
原帖由 xiabeizi 于 2009-1-2 19:45 发表
大家好,我做了一个挺简单实现异步通知的驱动函数。
已经可以实现异步通信了,可是好像只有用户空间进行完一次IO之后才能发出一个异步信号。
我是想在ioctl函数中,每隔2秒发出一个异步通知。可是没有实现,只有最 ...
5缩进嵌套是不是有问题      

作者: AIKO_sex   发布时间: 2009-01-02

缩进嵌套???
不是很明白,可以说明白一点吗?谢谢!      

作者: xiabeizi   发布时间: 2009-01-03