试图理解为什么在 socket.c 中有 ioctl 调用?我可以看到我正在使用的修改过的内核,它有一些 ioctl 调用,这些调用在进行调用时会加载到所需的模块中。
我想知道为什么这些调用最终会出现在 socket.c 中?不是套接字类型的非设备,ioctl 主要用于设备。
在这里谈论 2.6.32.0 大量修改的内核。
试图理解为什么在 socket.c 中有 ioctl 调用?我可以看到我正在使用的修改过的内核,它有一些 ioctl 调用,这些调用在进行调用时会加载到所需的模块中。
我想知道为什么这些调用最终会出现在 socket.c 中?不是套接字类型的非设备,ioctl 主要用于设备。
在这里谈论 2.6.32.0 大量修改的内核。
ioctl 受其历史名称的影响。虽然最初开发用于在设备上执行 i/o 控制,但它具有足够通用的构造,可以用于在文件描述符的上下文中对内核的任意服务请求。文件描述符是内核提供的一个不透明值(只是一个 int),可以与任何东西相关联。
现在,如果您将文件描述符视为文件,大多数 *nix 构造都会这样做,那么 open/read/write/close 是不够的。如果要标记文件(重命名)怎么办?如果您想等待文件可用(ioctl)怎么办?如果您想在文件关闭时终止所有内容(termios)怎么办?所有在核心读/写上下文中没有意义的“元”操作都集中在 ioctl 下;功能;等等,除非它们被频繁使用以至于它们应该拥有自己的系统调用(例如 BSD4.2 中的 flock(2) 功能)