2

以下のコードスニペット。基本的に、アクティブなvtを取得し、その端末に対してioctl KDGETLEDを発行して、capslock / numlock / scrolllockキーの現在の状態を確認します。ロックキーの状態に関係なく、常にresult=0になります。

私はこれを複数のLinuxボックスで試しましたが、すべてUbuntuのバリアント(Mintなど)を実行しています。「/dev/ tty」、「/ dev / console」、0など、KDGETLEDコマンドの他のfdsを試しました。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メンバーに割り当てられた関数をチェックします-それが適切にコーディングされていない場合(ioctlで多くのくだらないことが起こっているのを見ました)、それは間違いなくあなたの問題です。

この場合、私はそれがドライバーのせいであるとかなり確信しています。ioctlコマンドがコンパイルエラーを示さない限り、すべて(特にエラー処理と入力チェック)はドライバーのタスクです。

于 2013-03-09T18:31:27.093 に答える