linux平台按键异常现象

在Linux系统中,当按键应用繁忙且按键被快速连续按下时,可能出现按键事件丢失的问题。这源于按键缓冲区溢出,内核会丢弃事件并发送SYN_DROPPED事件。解决方案包括在接收到SYN_DROPPED事件时清除按键状态,忽略异常的抬起事件,以及处理重复的按键事件,确保按下和抬起事件成对出现。
摘要由CSDN通过智能技术生成

1. 问题:

linux平台下,按键应用处于忙状态,此时频繁按下按键,出现按键事件丢失等异常现象?

2. 原因:

按键缓冲区是一个环状缓冲区,如果插入事件导致head与tail相等,即可判定缓冲区发生了溢出,会丢弃缓冲区中的所有事件,同时内核会向缓冲区放入一个SYN_DROPPED事件,通知用户程序事件有丢失。

3. 解决:

由于内核input子系统上报的是按下和抬起事件,内核清空缓冲队列后可能会出现只上报单个抬起或者按下事件要注意处理。本次发现问题就是因为系统只上报按下事件没有抬起事件导致应用触发了长按事件。

当收到SYN_DROPPED事件时:

  • 清除按键保存的状态
  • 忽略掉第一次就出现的抬起事件
  • 忽略掉重复的按键事件(按键事件正常应该是按下、抬起成对出现的)
4. 内核代码

kernel/drivers/input/evdev.c

static void __pass_event(struct evdev_client *client,                           
                         const struct input_event *event)                       
{                                                                               
        ...                                                                   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值