Linux(Ubuntu)ioctl KDGETLED / KDGKBLED始终为0

时间:2013-03-09 18:25:44

标签: linux

下面的代码段;基本上,我抓住活动的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);

提前感谢所有审核我问题的人。

1 个答案:

答案 0 :(得分:1)

检查驱动程序代码,特别是该驱动程序的struct file_operations实例,并检查分配给.ioctl成员的函数 - 如果编码不好(我看到很多糟糕的事情发生了)在ioctls)然后这绝对是你的问题。

在这种情况下,我很确定这是司机故障。只要ioctl命令没有显示编译错误,所有内容 - 尤其是错误处理和输入检查 - 都是驱动程序的任务。