谁能解释一下,

  1. IOCTL是多少?
  2. 它是用来做什么的?
  3. 我怎么用?
  4. 为什么我不能定义一个与IOCTL相同的新函数?

推荐答案

ioctl表示"输入输出控制"是一种特定于设备的系统调用.Linux(300-400)中只有几个系统调用,不足以表达设备可能具有的所有独特功能.因此,驱动程序可以定义一个ioctl,它允许用户空间应用程序向其发送命令.然而,IOCTL不是很灵活,往往会变得有点杂乱(几十个"神奇数字",它们只是工作……或者不工作),而且也可能是不安全的,因为你将缓冲区传递到内核中——糟糕的处理很容易 destruct 东西.

另一种 Select 是sysfs接口,在该接口中,您可以在/sys/下设置一个文件,并对其进行读/写,以从驱动程序获取信息.下面是一个如何设置的示例:

static ssize_t mydrvr_version_show(struct device *dev,
        struct device_attribute *attr, char *buf)
{
    return sprintf(buf, "%s\n", DRIVER_RELEASE);
}

static DEVICE_ATTR(version, S_IRUGO, mydrvr_version_show, NULL);

在驱动程序设置过程中:

device_create_file(dev, &dev_attr_version);

然后,您的设备将有一个/sys/的文件,例如块驱动程序的/sys/block/myblk/version.

另一种更常用的方法是netlink,它是一种IPC(进程间通信)方法,用于通过BSD套接字接口与驱动程序通信.例如,WiFi驱动程序就使用了这一功能.然后使用libnllibnl3库从用户空间与它通信.

Linux相关问答推荐

条件句if的正确写法是怎样的?

在查找命令中使用 printf

Docker 不保留 chown 用户设置

在 Linux 中屏蔽文件中的位 - 按位运算

awk 使用动态列号

在 Linux 上的 std::threads 中创建子进程

RabbitMQ 安装后没有自动启动

将行转换为一条

如何使用 Bash 将随机数据块写入文件

根据外部请求在 Netbeans 中启动 XDebug

nohup 是否可以跨管道工作?

MessageBox 的 GTK 实现

哪个程序在给定任何文件的情况下创建一个 C 数组?

在 VIM 中搜索和替换导致尾随字符

如何使用 Ansible 等待服务器重启?

如何找到只对所有者具有特定权限的文件?

在 Ubuntu 中学习 OpenGL

UNIX `time` 命令对于基准测试是否足够准确?

Bash 将 awk 的输出捕获到数组中

查找和基本名称不能很好地播放