C 如何使用内核头编译用户空间程序
我需要使用C 如何使用内核头编译用户空间程序,c,linux,linux-kernel,kernel,linux-device-driver,C,Linux,Linux Kernel,Kernel,Linux Device Driver,我需要使用ioctl测试usbfs设备。 我需要使用ioctl(fd、USBDEVFS\u REAPURBNDELAY和receive)。 但是USBDEVFS\u REAPURBNDELAY是在内核头中定义的,所以我包括一些如下内核文件: #include <linux/usb.h> #include <linux/usbdevice_fs.h> #include <asm/byteorder.h> #include <linux/usb/ch9.h&
ioctl
测试usbfs设备。
我需要使用ioctl(fd、USBDEVFS\u REAPURBNDELAY和receive)代码>。
但是USBDEVFS\u REAPURBNDELAY
是在内核头中定义的,所以我包括一些如下内核文件:
#include <linux/usb.h>
#include <linux/usbdevice_fs.h>
#include <asm/byteorder.h>
#include <linux/usb/ch9.h>
用户程序不能使用内核头。即使你以某种方式这样做,也会受到强烈的劝阻。查看下面的链接以了解更多说明
如果您确实想从用户空间控制usb设备,请查看libusb 您真的不应该直接包含内核头。在某些情况下,处理它是必要的,而且可能是最好的方法,就是获取一个内核头的副本,然后只删除您需要的部分。但是在这种情况下,我不确定我是否理解为什么需要内核头。为什么仅仅包含
就不起作用
在我研究过的所有系统(两个不同的Ubuntu系统和一个RHEL 6系统)上,该文件都可以从用户空间中包含,并具有USBDEVFS\u REAPURBNDELAY
的定义。我试过了
#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>
int main()
{
printf("USBDEVFS_REAPURBNDELAY is %ld\n", USBDEVFS_REAPURBNDELAY);
return 0;
}
因此,至少根据您上面写的内容,ioctl定义不需要任何内核头。我怀疑您认为需要的任何其他用户空间USB内容都会以干净的标题导出到用户空间。谢谢。但我只需要一次。只是为了测试一个设备,所以我不关心内核的未来变化。:)非常感谢你。我厌倦了在没有内核头的情况下编译代码。但在运行它时,我遇到了另一个错误。我认为这与这个问题不同。所以我创造了一个新的
#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>
int main()
{
printf("USBDEVFS_REAPURBNDELAY is %ld\n", USBDEVFS_REAPURBNDELAY);
return 0;
}
USBDEVFS_REAPURBNDELAY is 1074287885