【发布时间】:2016-05-02 23:21:50
【问题描述】:
我需要使用ioctl 将fixp_t 键入的数字(定义在<linux/fixp-arith.h>,最初是s16)从内核模块传输到客户端应用程序。数据类型非常重要,如果变量大小不同 - 结果可能非常危险。
如果我在内核和客户端应用程序源代码中都包含<linux/fixp-arith.h>,客户端应用程序将无法编译,因为它找不到 linux 头文件。
另一方面,gcc -I/usr/src/linux-headers-3.16.0-4-common/include/ app.c -o app 不起作用,因为<linux/types.h> 重新定义了现有类型并且编译失败。
另一方面,我不敢自己指定任何数据类型,因为在每个拱门上s16,所以fixp_t 可能不同。
如何解决这个问题?
【问题讨论】:
-
fixp_t 数据类型为removed in 4.1,因此您将来在尝试使用该数据类型时可能会遇到问题。您最好使用自己的数据类型来保证传输,因为 这是您的 ioctl。 (返回类型扩大到s32)
-
@Petesh 好的,但是我应该如何处理返回
s16(4.1 之前)和s32之后的内核函数?我也许可以转换它......但我不知道什么类型会给我内核...... -
内核模块知道是因为是针对内核头文件编译的。所以转换不是问题。
-
@Frankie_C 但我必须调用一些特定的函数。想象一下我的
ioctl传输结构long int中有。在 3.16 内核中我得到 s16 结果,如果我尝试将其写入 32 字节整数会发生什么?我的意思是我必须自己进行一些转换。 -
@Frankie_C 明白了。函数名称不同。如果您将此添加为答案,我会接受。
标签: c gcc makefile header-files kernel-module