是要用系统调用啊,我的意思是lxinput只是把调整参数通过系统调用发给xserver,你不会看到它用某个系统调用直接操作某个设备文件的(不过这些调整实际也用不着操纵设备文件,只需要忽略设定时间段内的相同设备事件就行了)。另外所有的调整都是持久性的,也不存在你以为的临时调整,不保存时实际是再做一次调整恢复初始状态。
和xserver通信是通过本地socket文件/tmp/.X11-unix/X*,所以发送数据肯定是用write系或send系的系统调用,我看了一下,恰恰就是你排除掉的writev
以下是我的系统上strace列出的相关系统调用
代码: 全选
...前略...
socket(AF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3
connect(3, {sa_family=AF_LOCAL, sun_path=@"/tmp/.X11-unix/X0"}, 20) = 0
...中略...
writev(3, [{"\22\0\7\0\3\0\240\3w\1\0\0\6\0\0\0 \0\0\0\1\0\0\0\364\306\274\0", 28}, {NULL, 0}, {"", 0}], 3) = 28
recvmsg(3, {msg_name(0)=NULL, msg_iov(1)=[{"\34\0W\4\3\0\240\3w\1\0\0\376\306\274\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 4096}], msg_controllen=0, msg_flags=0}, 0) = 32
...后略...
开始时创建了个文件号fd为3的socket,然后连接到/tmp/.X11-unix/X0,以后都是通过writev和recvmsg向socket文件,或者说是socket文件背后的xserver收发消息