下面的代码段;基本上,我抓住活动的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);
提前感谢所有审核我问题的人。
答案 0 :(得分:1)
检查驱动程序代码,特别是该驱动程序的struct file_operations
实例,并检查分配给.ioctl
成员的函数 - 如果编码不好(我看到很多糟糕的事情发生了)在ioctls)然后这绝对是你的问题。
在这种情况下,我很确定这是司机故障。只要ioctl命令没有显示编译错误,所有内容 - 尤其是错误处理和输入检查 - 都是驱动程序的任务。