Shell-Script

確保 NumLock 處於開啟狀態的 CPU 效率最高的方法是什麼?

  • November 24, 2016

*情況:*我有一個監視 NumLock 狀態的腳本,不是真的在看,而是每 1 秒打開一次。該腳本在後台執行。

*推理:*我經常不小心關閉了NumLock。而且我沒有在鍵盤上顯示 NumLock 狀態。

作業系統,DE,DM,WM xmodmap,:

作業系統

$ lsb_release -a

No LSB modules are available.
Distributor ID: LinuxMint
Description:    Linux Mint 18 Sarah
Release:    18
Codename:   sarah

桌面環境

echo $DESKTOP_SESSION

cinnamon

顯示管理器

cat /etc/X11/default-display-manager

/usr/sbin/mdm

視窗管理器

wmctrl -m | head -n 1

Name: Mutter (Muffin)

xmodmap:

xmodmap -pm

xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

我原來的 Bash 腳本如下:

#!/bin/bash

while true
do

 numlockx on

 sleep 1s

done

如您所見,該腳本不關心 NumLock 的目前狀態。它只是不斷地打開它。

目標:我想讓腳本至少有點CPU 效率

問題:在 Linux (Mint 18) 中確保 NumLock 開啟的CPU 效率最高的方法是什麼?

不,它沒有效率。問題是,查詢 NumLock 狀態的成本與設置 NumLock 狀態的成本相同。因此,如果您在設置狀態之前嘗試查詢狀態,您只會加倍負載。

你可以通過編寫編譯後的 C 程式碼讓它變得更好,因為你可以避免 fork / exec 和解釋成本,但它仍然是一個可怕的 hack。

相反,您可以做的是將 NumLock 設置為打開,然後禁用 NumLock 鍵(如果您想要的只是數字鍵盤始終是數字,甚至可以忽略它的狀態)。

有關如何使用*xmodmap(1)*執行此操作的詳細資訊,請參閱此SuperUser 文章

最高效的 CPU 方法是禁用NumLockusing xmodmap,然後您根本不需要輪詢NumLock狀態。換句話說,花費的 CPU 時間為零。這可以通過

xmodmap -e "remove mod2 = Num_Lock"

如果你想再次使用它,打開它

xmodmap -e "add mod2 = Num_Lock"

或者,~/.Xmodmap使用類似的行創建一個文件,並確保您的 X 啟動讀取該文件(一些現代桌面環境不讀取)。

詳情請參閱man xmodmap

引用自:https://unix.stackexchange.com/questions/301846