Метод IOCTL - Linux
У меня есть экзаменационный вопрос, и я не совсем понимаю, как его решить. Водитель, который нуждается в ioctl
метод, который будет реализован и проверен.
Я должен написать ioctl()
метод, связанная программа испытаний, а также общий IOCTL
определения. ioctl()
Метод должен обрабатывать только одну команду. В этой команде мне нужно передать структуру данных из пространства пользователя в область ядра. Ниже показана структура:
struct data
{
char label [10];
int value;
}
- Водитель должен распечатать
IOCTL
данные команды, используяprintk()
; - Имя устройства
"/dev/mydevice"
Тестовая программа должна проверить режим драйвера, используя инициализированную структуру данных.
Надеюсь, что есть некоторые, которые могут помочь заранее спасибо
Мое предложение:
static int f_on_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg)
{
int ret;
switch (cmd)
{
case PASS_STRUCT:
struct data pass_data;
ret = copy_from_user(&pass_data, arg, sizeof(*pass_data));
if(ret < 0)
{
printk("PASS_STRUCT\n");
return -1;
}
printk(KERN ALERT "Message PASS_STRUCT : %d and %c\n",pass_data.value, pass_data.label);
break;
default:
return ENOTTY;
}
return 0;
}
Определения: Common.h
#define SYSLED_IOC_MAGIC 'k'
#define PASS_STRUCT _IOW(SYSLED_IOC_MAGIC, 1, struct data)
Тестовая программа:
int main()
{
int fd = open("/dev/mydevice", O_RDWR);
data data_pass;
data_pass.value = 2;
data_pass.label = "hej";
ioctl(fd, PASS_STRUCT, &data_pass);
close(fd);
return 0;
}
Это совершенно неправильно?