Я разрабатываю модуль драйвера устройства и связанные с ним библиотеки пользователей для обработки вызовов ioctl(). Библиотека берет соответствующую информацию и помещает ее в структуру, которая передается в модуль драйвера и распаковывается там, а затем обрабатывается (я опускаю много шагов, но общая идея).
Некоторые данные, передаваемые через struct через ioctl(), являются uint32_t. Я обнаружил, что этот тип определен в stdint.h И linux/types.h. До сих пор я использовал linux/types.h для определения этого значения, в том числе и в пользовательских библиотеках. Но я понимаю, что плохая форма использовать библиотеки linux/*. H в пользовательском пространстве, поэтому, если я удалю их и вместо этого использую stdint.h, тогда, когда мой модуль драйвера включает определение структуры, он должен включать в себя stdint.h также.
Мне кажется, что точка linux/types.h - это определение типов в файлах ядра, поэтому я не уверен, что это означает использование stdint.h, это плохая идея. Я также обнаружил, что когда TRYING использует stdint.h в моем модуле драйвера, я получаю ошибки компиляции о переопределениях, которые не исчезнут, даже если я заменю все экземпляры linux/types.h на stdint.h(и наденьте его на верхний порядок включения).
Soo....
- Неплохо ли использовать linux/*.h в коде пользовательского пространства?
- Неплохо ли использовать stdint.h в коде ядра?
- Если ответы на оба из них да, то как мне обрабатывать ситуацию, когда структура, содержащая uint32_t, совместно используется как библиотекой пользователя, так и модулем драйвера?
Спасибо.