正如在这个问题中指出的,Linux内核模块中的ioctl函数的原型是:
(第1版)
int ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg);
或
(第2版)
long ioctl(struct file *f, unsigned int cmd, unsigned long arg);
我想在实现字符设备驱动程序的内核模块中使用它们。
在这种情况下,上述两种原型是否都适合?如果是,为什么?如果没有,如何选择正确的?
哪些头/源文件(S)包含这些原型?换句话说:这些原型的官方参考文件是什么?
linux驱动模块中ioctl的原型是
int ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg);
或
long ioctl(struct file *f, unsigned int cmd, unsigned long arg);
但在sys/ioctl.h
int ioctl(int fd, int request, void *argp);
第一个参数类型不同,在ioctl调用程序和驱动程序之间是否有模块来转换这个参数(从文件描述符到文件结构指针)?
这个映射是如何工作的?(从文件描述符
根据,fcntl.ioctl的用法如下:
fcntl.ioctl(fd, op[, arg[, mutate_flag]])
将op定义为
The operation is defined by op and is operating system dependent. These codes are also found in the fcntl module.
它不会回答“什么”是op。它是int类型的吗?一根线?一种结构?如何正确使用此命令,例如在Linux平台上?
我一直在学习如何在基于linux的系统中使用IOCTL来控制设备,并阅读了一篇文章。作者说,IOCTL原型在Unix系统调用列表中脱颖而出,因为在编译过程中使用了dots int ioctl(int fd, unsigned long cmd, ...),从而阻止了类型检查。最后一部分是我不太好的地方。我担心的是,不检查类型可能会导致一些控制外围设备的问题?有什么更可靠的方法或最佳做法来监控外围设备呢?谢谢
我试图在Android上运行一个简单的IOCTL示例。我正在使用内核2.6和ICS。模块已正确注册/未注册(insmod/rmmod)。但是,每次尝试在模拟器上执行./user_app时,我总是
error: first ioctl: Not a typewriter
error: second ioctl: Not a typewriter
message: `�
这很明显是个通货。我调试了应用程序,没有执行fops过程(device_ioctl、read_ioctl和write_ioctl)。
我想知道在Android上使用/实现IOCTL是否有任何限制。先谢谢你。
-劳尔
以下是代码
我想从硬盘里得到基本信息然后打印出来。最重要的是物理扇区的大小是正确的。
在过去的几个小时里,为了得到我想要的东西,我一直在和ioctl打拼,但是我想不出来。
我以前从未使用过ioctl,我似乎找不到一个简单的解释,你到底要做什么。
总之,我的代码看起来像这样
int main () {
FILE *driveptr;
int sectorsize;
struct hd_driveid hd;
driveptr=fopen("/dev/sda","r");
if (ioctl(driveptr,HDIO_GET_IDE