Статическая глобальная переменная и статическая локальная переменная в функции драйвера - PullRequest
8 голосов
/ 14 мая 2011

В одном из моих примеров модулей ядра Linux у меня есть переменная Device_Open, объявленная статической вне всех функций, и статическая переменная counter, объявленная внутри функции device_open.Внутри device_open я увеличиваю Device_Open и counter.Модуль вставлен без каких-либо ошибок в ядро, и я создал файл устройства для моего модуля /dev/chardev.

I do cat /dev/chardev.Я могу видеть, что counter увеличивается для каждого вызова cat /dev/chardev, но Device_Open всегда остается 0. В чем причина различий в поведении, связанных с увеличением значения переменных?

Ниже приведен фрагмент кода для понимания

static int Device_Open = 0;

static int device_open(struct inode *inode, struct file *file)
{
    static int counter = 0;

    printk(KERN_INFO "Device_Open = %d", Device_Open);
    printk(KERN_INFO "counter = %d", counter);

    if (Device_Open)
        return -EBUSY;

    Device_Open++;
        counter++;

    try_module_get(THIS_MODULE);

    return SUCCESS;
}

1 Ответ

7 голосов
/ 14 мая 2011

Я искал "Device_open" и нашел соответствующий выпуск устройства.Вы уверены, что у вас нет этой функции?Я нашел это в TLDP .

static int device_release(struct inode *inode, struct file *file)
{
#ifdef DEBUG
    printk(KERN_INFO "device_release(%p,%p)\n", inode, file);
#endif

    /* 
     * We're now ready for our next caller 
     */
    Device_Open--;

    module_put(THIS_MODULE);
    return SUCCESS;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...