Существует ли распространенная практика для программ пользовательского пространства включать ioctl
коды, используемые в модуле ядра.Включая коды ioctl в программу пользовательского пространства
mydev.h:
#ifndef MYDEV_H
#define MYDEV_H
#define <linux/ioctl.h>
#define MYDEV_IOC_MAGIC 'C'
#define MYDEV_IOC_FOO _IO(MYDEV_IOC_MAGIC, 0)
#define MYDEV_IOC_BAR _IOW(MYDEV_IOC_MAGIC, 1, int)
#endif
Я обычно кладу ioctl
кодов в заголовок, который я включил в моем модуле кода ядра. Я просто включил этот заголовок в свои приложения для пользовательского пространства, но я понял, что путь к файлу linux/ioctl.h может отсутствовать в большинстве систем (например, в системах без экспортированных заголовков ядра).
Решение состоит в том, чтобы изменить линию включения: #include <sys/ioctl.h>
; но тогда я не мог использовать этот заголовок для моего модуля ядра.
Есть ли лучшее решение этой проблемы, или, как правило, есть два отдельных, но почти идентичных файла заголовка?
Если вы беспокоитесь о техническом обслуживании, вы можете просто создать заголовок userland из заголовка ядра при создании своего модуля. –
Есть ли способ оценить макрос препроцессора и распечатать его в файл с препроцессором GCC? –
Если нет, то обычно приходится писать автономную программу на языке С, которая генерирует заголовок userland, передавая определения printf; или существует другой предпочтительный метод? –