2012-03-06 3 views
3

Я пишу драйвер в Linux. Как я могу использовать ioctl для связи между пользовательской программой и драйвером? В моем драйвере, структура выглядит следующим образом:Как я могу использовать ioctl для связи между пользовательской программой и драйвером?

struct file_operations fops = {.read = device_read,.write = device_write,.unlocked_ioctl = device_ioctl,.open = device_open,.release=device_release }; 

В моем понимании, здесь device_ioctl это функция, которая обрабатывает IOCTL вызов из пользовательской программы. А вызов возможен с переменным числом параметров.

Но я не уверен в способе использования ioctl. Также полностью смущен и хочет узнать, как я могу написать device_ioctl?

Может ли кто-нибудь мне помочь?

Заранее спасибо.

+2

Во-первых, вы должны узнать, как 'ioctl' используется из пользовательского пространства, а затем проверить, как аналогичные драйверы реализовать его, то цифра вне зависимости от вашего водителя. –

+0

можете ли вы предложить ссылку ?. – tijin

ответ

1
  1. Используйте register_chrdev, чтобы получить основное число для вашего файла ядра. Дайте fops в качестве параметра.
  2. Вы получаете большое количество возвращенных товаров (вы также можете найти его в /proc/devices) используйте этот номер командой mknod для создания /dev/yourdevice.
  3. В коде кода пользователя откройте /dev/yourdevice и используйте функцию ioctl с файловым дескриптором.
2

Я считаю, что глава 6.1 может ответить на ваш вопрос хорошими примерами.

0

Вы можете использовать любой proc файл вместо устройства в таком виде:

static long my_proc_ioctl(struct file * file, unsigned int cmd, unsigned long arg) 
{ 
    printk("%s() cmd=%.08x arg=%pK\n", __func__, cmd, (void *)arg); 
    return 0; 
} 

static const struct file_operations my_ioctl_fops = { 
    .owner = THIS_MODULE, 
    .unlocked_ioctl = my_proc_ioctl, 
}; 

[...] 
proc_create("my_ioctl_file", 0600, NULL, &my_ioctl_fops); 
[...]