作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
下面的代码片段;基本上,我正在获取事件 vt 并针对 capslock/numlock/scrolllock 键的当前状态针对该终端发出 ioctl KDGETLED,并且无论锁定键的状态如何,我总是得到 result=0。
我已经在多个 Linux 机器上尝试过这个,所有机器都运行 Ubuntu 的变体(例如 Mint)。我已经为 KDGETLED 命令尝试了其他 fds,例如“/dev/tty”、“/dev/console”、0 等。我遇到了与 KDGKBLED 相同的问题。其他人是否遇到了同样的问题,我是否在做一些愚蠢的事情,我是否遇到了编写糟糕的驱动程序,或者其他什么?
int fd;
vt_stat stat;
fd = open("/dev/tty0", O_RDONLY);
if (ioctl(fd, VT_GETSTATE, &stat) == -1) {
fprintf(stderr, "Error on VT_GETSTATE\n");
exit(1);
}
close(fd);
char tty[128];
sprintf(tty, "/dev/tty%d", stat.v_active);
printf("Query tty: %s\n", tty);
char result;
fd = open(tty, O_RDWR | O_NDELAY, 0);
if (ioctl(fd, KDGETLED, &result) == -1) {
fprintf(stderr, "Error on KDGETLED\n");
exit(1);
}
close(fd);
printf("LED flag state: %d\n", result);
提前感谢所有审阅我的问题的人。
最佳答案
检查驱动程序代码,尤其是该驱动程序的 struct file_operations
实例,并检查分配给 .ioctl
成员的函数 - 如果编码不当(我'我已经看到 ioctls 中发生了很多糟糕的事情)那么这绝对是你的问题。
在这种情况下,我很确定这是驱动程序的错误。只要 ioctl 命令没有显示编译错误,一切——尤其是错误处理和输入检查——都是驱动程序的任务。
关于Linux (Ubuntu) ioctl KDGETLED/KDGKBLED 始终为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15314315/
下面的代码片段;基本上,我正在获取事件 vt 并针对 capslock/numlock/scrolllock 键的当前状态针对该终端发出 ioctl KDGETLED,并且无论锁定键的状态如何,我总是
我是一名优秀的程序员,十分优秀!