#c #printf #linux-device-driver
#c #printf #linux-драйвер устройства
Вопрос:
У меня есть кое-что в моем коде, как показано ниже: это код для создания УСТРОЙСТВА в Linux под /dev
#define PRINTER_STR "printer_"
char str[32];
snprintf(str, sizeof(str), PRINTER_STR "%s%s", dev->type, "%u");
device_create(mycan_drv.class, parent,
MKDEV(dev->nMajor, dev->nMinor),
dev, str, dev->nMinor);
4-й параметр, snprintf
которому dev->type
присваивается строка типа epson
, hp
, canon
.
Полученный результат выглядит примерно так: printer_epson32
, printer_hp33
, printer_canon34
В приведенных выше выходных строках я не мог понять, как строятся такие числа, как 32
, 33
, 34
. Я могу понять, что это из-за 5-го параметра, "%u"
переданного snprintf
. Но как?
Все ссылки, которые я получил, содержат максимум 3 или 4 параметра snprintf
. Пожалуйста, помогите.
Комментарии:
1. Вы пытались прочитать страницу руководства? snprintf
2. Вы могли бы сделать:
device_create(mycan_drv.class, parent, MKDEV(dev->nMajor, dev->nMinor), dev, PRINTER_STR "%s%u", dev->type, dev->nMinor);
.
Ответ №1:
char str[32];
dev->type = "epson";
snprintf(str, sizeof(str), "printer_" "%s%s", dev->type, "%u");
приводит к:
str = "printer_epson%u".
Тогда код выполняет:
device_create(..., str, dev->nMinor);
что на самом деле:
device_create(..., "printer_epson%u", dev->nMinor);
а затем внутри снова вызывается device_create
*printf
подобная функция, и она записывает dev->nMinor
вместо %u
. Так, например, это не snprintf
то, что записывает число, число записывается внутри device_create
. snprintf
используется для создания строки форматирования для device_create
и device_create
записывает это число.
Примечание сбоку: "%s%s", dev->type, "%u")
Выглядит странно, это могло быть просто "%s%%u", dev->type);
. И в любом случае, несмотря на все, что это могло быть device_create(...., "%s%u", dev->type, dev->nMinor)
.
Комментарии:
1. Спасибо @KamilCuk, ваше объяснение было аккуратным и ясным. Это было полезно.
Ответ №2:
Проще было бы:
snprintf(str, sizeof(str), PRINTER_STR "%s%%u", dev->type);
Поскольку %u
является фиксированной строкой, она может быть просто включена в формат. %
Необходимо экранировать, чтобы избежать интерпретации snprintf.