2013-04-18 3 views
2

Существует ли распространенная практика для программ пользовательского пространства включать 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>; но тогда я не мог использовать этот заголовок для моего модуля ядра.

Есть ли лучшее решение этой проблемы, или, как правило, есть два отдельных, но почти идентичных файла заголовка?

+3

Если вы беспокоитесь о техническом обслуживании, вы можете просто создать заголовок userland из заголовка ядра при создании своего модуля. –

+0

Есть ли способ оценить макрос препроцессора и распечатать его в файл с препроцессором GCC? –

+0

Если нет, то обычно приходится писать автономную программу на языке С, которая генерирует заголовок userland, передавая определения printf; или существует другой предпочтительный метод? –

ответ

5

Вы можете использовать _ KERNEL _ макрос.

#ifdef __KERNEL__ 
#include <linux/ioctl.h> 
#else 
#include <sys/ioctl.h> 
#endif 

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

Смежные вопросы