2016-06-09 12 views
0

Я пытаюсь изменить драйвер клавиатуры в minix, моя идея заключается в хранении в файле всех символов, которые были введены в клавиатуре. Я объявляю глобальный FILE * fp и вставляю этот фрагмент кода в /usr/src/drivers/tty/keyboard.cMinix keyboard Driver

while (icount > 0) { 
     scode = *itail++;  /* take one key scan code */ 
      if (itail == ibuf + KB_IN_BYTES) itail = ibuf; 
      icount--; 

      /* Function keys are being used for debug dumps. */ 
      if (func_key(scode)) continue; 

      /* Perform make/break processing. */ 
      ch = make_break(scode); 

      if (ch <= 0xFF) { 
        /* A normal character. */ 

        fp = fopen("log.txt","a+"); 
        fprint(fp,"%c",ch); 
        fclose(fp); 

        buf[0] = ch; 
        (void) in_process(tp, buf, 1); 
      } else ... 

тогда я бегу «сделать» в каталоге и перезагрузки, но это не работает. Я имею в виду, что файл не создан. Любая идея?

+0

«... не работает» немного туманно. Измените свой вопрос и добавьте дополнительную информацию о том, что «не работает». Это слишком медленно? Не записывает ключи в файл? Открывает шлюз между мирами, через которые созревают чудовищные существа с грязным злом? –

+0

Если вы _truly_ изменяете клавиатуру _driver_ (то есть, она находится в ядре minux), вы не сможете использовать потоки стиля 'stdio.h' [если minux не отличается от любого другого ядра unix, которое я когда-либо использовал] , Вы должны будете использовать внутренние функции minix для ввода-вывода. И, делая 'open, write one char, close' является _extremely_ неэффективным [и может привести к осложнениям]. Откройте файл журнала _once_ –

+0

Но я думаю, что драйверы minix относятся к пользовательскому пространству, и в этом мини-учебнике используются функции stdlib ... http://wiki.minix3.org/doku.php?id=developersguide:driverprogramming –

ответ

0

Это не сработает. Драйвер клавиатуры находится внутри драйвера «TTY», который отвечает за консоль. FS/VFS будет передавать запросы ввода-вывода, относящиеся к этой консоли, до TTY. fopen, fprint и fclose в вашем коде - это способы выполнения таких запросов. Но VFS может обрабатывать запросы только от «пользовательских» программ (и передавать их драйверам); TTY не является «пользовательской» программой и поэтому не может выполнять запросы ввода-вывода.

+1

, OP запускает «make» и как-то думает, что он построен. – Kaz

+0

@AntonieL Извините, но вы ошибаетесь, программа работает нормально, проблема в том, что я запускал «make» в другом каталоге ... –

+0

ОК, я ошибаюсь, так как неправильно понял, что программа, которую вы написали, не была 'TTY' (какой источник находится в'/usr/src/drivers/tty/keyboard.c'), и ваша неопознанная программа в порядке. Извините за потерянное время. Кроме того, вам лучше воздержаться от восстановления ядра. – AntoineL