Использование решений w и/dev позволит вам до сих пор, так как может быть, что пользователь находится рядом, но ничего не набрал в оболочке - например, он/она может играть в какую-то игру. Лучшим подходом будет опрос/proc/interrupts. Локальные прерывания для мыши и клавиатуры часто находятся под «i8042» (хотя в некоторых редких случаях это может быть иначе). Возможно, вы захотите попробовать: «grep i8042/proc/interrupts». Это даст IRQ 1 (клавиатура) и IRQ 12 (обычно, мышь). Вы можете получить значения, сохранить их, а затем опросить время от времени (без обратного вызова, увы), чтобы получить подсчеты. Если числа были изменены, произошли прерывания - это означало, что клавиатура (IRQ 1) или мышь (IRQ 12) были затронуты/нажаты и т. Д. Нажатия клавиш обычно генерируют два прерывания (клавиша вниз, клавиша вверх). Движение мыши более неустойчивое.
Это имеет ряд преимуществ:
1) Если пользователь так много, как касается мыши, или нажимает клавишу - вы знаете 2) Вы можете сделать это программно (т.е. FOPEN()/Proc/прерывания, или (альтернативно)/proc/stat, и получить строку «intr») и fread() соответствующие строки 3) Для этого вам даже не нужно быть root.
Это классно. Хотя кажется, что он не работает с USB-клавиатурой/мышью? –
Я только что проверил, есть также прерывания USB. Однако они происходят на регулярной основе. Поэтому я могу вычесть этот показатель, чтобы увидеть, есть ли дополнительные события. Это должно сработать. –
Не работает с USB, правильно, но USB по-прежнему является источником прерываний. Так да. Корреляция может быть не 1: 1, как у i8042, но - все равно - вы получите ненулевое значение, когда пользователь активен - именно это вы хотели в первую очередь. – Technologeeks