信号量不会在Ioctl的背景下醒来

时间:2015-04-21 15:57:57

标签: kernel driver semaphore ioctl ldd

我有一个正在处理的设备驱动程序。它的工作原理如下:

1. User app sends ioctl cmd 0x01 to driver that puts it to sleep.
2. User app sends another ioctl cmd 0x02 to driver that wakes it up.

我这样做是因为我的硬件尚未就绪,所以我还没有设备可以与之交谈。

问题:当我发送ioctl cmd 0x01以使驱动程序进入休眠状态时,我的用户应用程序会休眠/挂起但是当我发送ioctl cmd 0x02时,它不会被警告唤醒。我打印出信号量计数以查看最新情况并注意到每个案例,my_sem.count == 0在调用down()/ up()之前。

一般来说,我不了解的司机是什么?看来我的ioctl处理程序为我用我的用户应用程序发送的每个ioctl cmd都有不同的my_sem副本。当我为up()发送几个连续的cmds时,我希望看到调用up()的每个ioctl cmd的计数增加,但是它总是在up()之前打印出ZERO而在up()之后打印出来。

/* PSEUDO CODE */
// global defn
DEFINE_SEMAPHORE(my_sem);
.
.
.
// file ops ioctl handler
int foo_CharIoctl(struct file * file, 
              unsigned int cmd, 
              unsigned long arg)
{
    sema_init(&my_sem, 0);
.
.
.
    switch(cmd)
    {
        case 0x01:
            printf my_sem.count;
            down_killable(&my_sem);
            printf my_sem.count;
        case 0x02:
            printf my_sem.count;
            up(&my_sem);
            printf my_sem.count;
        ...
    }
}

1 个答案:

答案 0 :(得分:0)

每次调用foo_CharIoctl()时,您似乎都在重新初始化信号量。 sema_init()应该放在你的驱动程序初始化中。