Linux下读写ec_sys文件引发键盘按键重复问题求助
关于MSI笔记本Cooler Boost快捷切换程序的问题
背景
- 测试
isw工具时发现,可通过# isw -b on/off命令开启或关闭Cooler Boost;通过strace追踪得知其原理:向/sys/kernel/debug/ec/ec0/io的0x98偏移处写入0(关闭)或0x80(开启)。 - 为实现快捷切换,编写了带setuid权限的C程序,代码如下:
#include <unistd.h> #include <stdio.h> int main() { int err = setuid(0); if(err) { perror("setuid"); return 2; } FILE *ec = fopen("/sys/kernel/debug/ec/ec0/io", "rb+"); if(!ec) { perror("fopen"); return 1; } fseek(ec, 0x98, SEEK_SET); int state = fgetc(ec); fseek(ec, 0x98, SEEK_SET); if (state == 0) state = 0x80; else state = 0; fputc(state, ec); fclose(ec); return 0; }
问题现象
- 终端直接执行程序时,会输出大量换行;
- 将程序绑定为Super+F1快捷键触发时,键盘完全失灵(仅鼠标可用),且风扇未提速;
- 改为在图形终端中通过快捷键执行,发现大量终端窗口被重复打开并执行该程序。
临时解决方法
在程序开头添加sleep(1)语句后,换行和重复执行的问题得到解决。
求助内容
- 除了添加
sleep(1)外,是否有更优的解决方案? - 该问题属于系统bug还是硬件问题?(已查看Linux内核
ec_sys.c源码未发现异常,使用环境:Arch Linux、Gnome Wayland、MSI笔记本)
内容的提问来源于stack exchange,提问作者Yarm
相关产品推荐
相关产品推荐

