Linux获取键盘当前值

在使用Linux的/dev/input/eventX接口获取键盘事件时,如果程序重启,之前的按键已经处于按下状态,将无法获取到更新事件(因为本来就无事件更新)。此时,需要在程序启动时,先判断按键的当前值,可使用ioctl的EVIOCGKEY来获取。

查了网上别人的示例,发现在MIPS上有问题。所以又看一下内核的代码,发现示例都写错了,仅可以在小端CPU上碰巧使用正确。获取值的空间不应该为uint8_t类型,而是unsigned long类型。所以,应该如下:

#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <string.h>

#define EVDEV "/dev/input/event2"

int main(int argc, char **argv) {
    unsigned long key_states[KEY_MAX/32 + 1];
    struct input_event evt;
    int fd;

    memset(key_states, 0, sizeof(key_states));
    fd = open(EVDEV, O_RDWR);
    ioctl(fd, EVIOCGKEY(sizeof(key_states)), key_states);

    //Key value is: (key_states[key/32]>>(key%32)) & 1
    //....
    //Wrote by: oopsdump.com
}

上例参考了:https://stackoverflow.com/questions/27063833/linux-input-device-events-how-to-retrieve-initial-state。

CentOS7中安装远程桌面

以前一直使用VNC连接Linux服务器的远程桌面。突然想找找有没有更方便的办法,发现了xrdp这个工具,可以直接使用windows的远程进行连接。下面是安装步骤,及遇到问题的解决办法。转载的话,请注明来自:Oopsdump.com,谢谢。

首先,CentOS中需要安装epel库,如已安装过,可跳过该步:

yum install epel-release

然后,安装xrdp及需要的vnc服务端:

yum install xrdp tigervnc-server

最后,启动服务,并设置为开机启动:

systemctl start xrdp
systemctl enable xrdp

如开启了防火墙,还需要开放相应端口:

firewall-cmd --permanent --zone=public --add-port=3389/tcp
firewall-cmd --reload

下面是可能遇到的问题:

如果远程遇到颜色错误,配置xrdp.ini文件:将/etc/xrdp/xrdp.ini中的max_bpp=32,改为max_bpp=24。

如果在远程登录后,遇到提示“Authentication is required to create a color profile”,需要输入管理员密码。可以增加下面文件: /etc/polkit-1/rules.d/02-allow-colord-oopsdump-com.conf,内容如下:(注意:将下面的{group}替换为你需要允许的用户组)

polkit.addRule(function(action, subject) {
 if ((action.id == "org.freedesktop.color-manager.create-device" ||
 action.id == "org.freedesktop.color-manager.create-profile" ||
 action.id == "org.freedesktop.color-manager.delete-device" ||
 action.id == "org.freedesktop.color-manager.delete-profile" ||
 action.id == "org.freedesktop.color-manager.modify-device" ||
 action.id == "org.freedesktop.color-manager.modify-profile") &&
 subject.isInGroup("{group}")) {
 return polkit.Result.YES;
 }
 });

如果还有问题,可以在/etc/polkit-1/localauthority/50-local.d/下增加文件45-allow-colord-oopsdump-com.pkla:

[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes

上述更改完成后,需要重启polkit服务,或重启系统。如:systemctl restart polkit。

如果xrdp无法启动,可以尝试:

chcon -t bin_t /usr/sbin/xrdp
chcon -t bin_t /usr/sbin/xrdp-sesman 

如果需要禁用功能,可以将/etc/xrdp/xrdp.ini中相应的channel用#注释后,重启服务:

rdpdr=true  设备重定向开启。
rdpsnd=true  声音功能开启。
drdynvc=true  初始化附加的动态Channel开启。
cliprdr=true  剪切板重定向开启。
rail=true  远程应用集成到本地(RAIL)开启。
xrdpvr=true  XRDP视频流功能开启。
tcutils=true  远程推出USB及关闭电源等功能开启。