关闭uinput设备时ioctl报Inappropriate ioctl for device错误求助
uinput设备销毁时报
Inappropriate ioctl for device错误的原因分析 1 核心错误:init_uinput_device返回值异常(最高概率原因)
你实现的init_uinput_device函数存在严重逻辑错误:函数成功完成设备创建流程后,返回值是0而非打开的uinput文件描述符。你调用该函数时必然使用类似int fd = init_uinput_device();的逻辑接收返回值,拿到的fd实际是标准输入的文件描述符,对普通标准输入字符设备调用uinput专属的UI_DEV_DESTROYioctl命令,自然会报设备不支持该ioctl的错误。
修复方案:将init_uinput_device成功分支的返回值从return 0;修改为return fd;。
2 次要错误:uinput_create_device传参错误
你封装的uinput_create_device函数中,UI_DEV_SETUP的ioctl传参不符合要求:
// 错误写法 if (ioctl(uinput_fd, UI_DEV_SETUP, &usetup) == -1)
函数入参usetup本身已经是struct uinput_setup*类型的指针,再次取地址相当于传递了二级指针,内核无法正确读取设备配置信息。虽然当前巧合完成了设备创建,但内核中uinput上下文状态异常,也会导致后续销毁命令执行失败。
修复方案:修改为if (ioctl(uinput_fd, UI_DEV_SETUP, usetup) == -1)。
3 其他可能原因
- 内核版本兼容问题:部分旧版本Linux内核不支持
UI_DEV_DESTROY命令,这种场景下可以直接省略该ioctl调用,close文件描述符后内核会自动销毁uinput设备 - 文件描述符提前失效:确认调用
close_uinput_device时传入的fd未被其他逻辑提前关闭,避免对无效fd执行ioctl操作
内容的提问来源于stack exchange,提问作者DavidGL
相关产品推荐
相关产品推荐

