我如何使用ioctl进行用户程序和驱动程序之间的通信?

时间:2012-03-06 12:57:36

标签: c module linux-kernel kernel linux-device-driver

我正在linux中编写驱动程序。我如何使用ioctl进行用户程序和驱动程序之间的通信? 在我的驱动程序中,结构如下:

struct file_operations fops = {.read = device_read,.write = device_write,.unlocked_ioctl = device_ioctl,.open = device_open,.release=device_release };

在我的理解中,这里device_ioctl是一个处理来自用户程序的ioctl调用的函数。并且可以使用可变数量的参数进行调用。

但我不确定使用ioctl的方式。也完全困惑,并渴望知道我怎么能写device_ioctl?

任何人都可以帮助我吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

我相信LDD3第6.1章可以用很好的例子回答你的问题。

答案 1 :(得分:1)

  1. 使用register_chrdev获取内核文件的主编号。将fops作为参数。
  2. 您返回一个主号码(您也可以在/proc/devices中找到)使用此号码和mknod命令创建/dev/yourdevice
  3. 在您的用户空间代码中,打开/dev/yourdevice并将ioctl函数与文件描述符一起使用。

答案 2 :(得分:0)

您可以使用任何proc文件代替设备:

static long my_proc_ioctl(struct file * file, unsigned int cmd, unsigned long arg)
{
    printk("%s() cmd=%.08x arg=%pK\n", __func__, cmd, (void *)arg);
    return 0;
}

static const struct file_operations my_ioctl_fops = {
    .owner = THIS_MODULE,
    .unlocked_ioctl = my_proc_ioctl,
};

[...]
proc_create("my_ioctl_file", 0600, NULL, &my_ioctl_fops);
[...]