2

下面的代码片段;基本上,我正在抓取活动的 vt 并针对该终端发出一个 ioctl KDGETLED 以获取 capslock/numlock/scrolllock 键的当前状态,并且无论锁定键的状态如何,我总是得到 result=0。

我已经在多个 Linux 机器上尝试过这个,所有运行 Ubuntu 的变体(例如 Mint)。我已经为 KDGETLED 命令尝试了其他 fd,例如“/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);

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

4

1 回答 1

1

检查驱动程序代码,尤其是该驱动程序的struct file_operations实例,并检查分配给.ioctl成员的功能 - 如果编码不当(我已经看到 ioctls 中发生了很多糟糕的事情),那么这绝对是你的问题。

在这种情况下,我很确定这是驱动程序的错。只要 ioctl 命令没有显示编译错误,一切——尤其是错误处理和输入检查——都是驱动程序的任务。

于 2013-03-09T18:31:27.093 回答