Как я могу использовать fork для вычисления частичных результатов вычислений?

В принципе, да. Когда я в последний раз делал это в 2012 году , выход состоял в том, чтобы попытаться сказать Linux, что вторая клавиатура очень странная и на самом деле означает XF86VolumeUp , когда она отправляет нажатие клавиши для Число 1 или что-то в этом роде. К счастью, есть довольно много кодов клавиш, которых нет на стандартных клавиатурах, которые вы можете использовать таким образом.

Давайте рассмотрим это для одного ключа:

  • используйте xev | grep -i key, чтобы найти коды клавиш на дополнительной клавиатуре. Я просто наберу keypap 9 , например, с кодом клавиши 81. (NB :на моей дополнительной клавиатуре есть клавиша с надписью «00», но она дважды отправляет «0», у меня нет идея, как справиться с этим.)
      KeyPress event, serial 38, synthetic NO, window 0x4400001,
        state 0x10, keycode 81 (keysym 0xffb9, KP_9), same_screen YES,
      KeyRelease event, serial 39, synthetic NO, window 0x4400001,
        state 0x10, keycode 81 (keysym 0xffb9, KP_9), same_screen YES,
        request MappingKeyboard, first_keycode 8, count 248
  • проверьте setxkbmap -queryправила вашей (основной )клавиатуры. Мы постараемся превратить вашу дополнительную клавиатуру в дюжину или около того мультимедийных клавиш на этой раскладке. Для меня это
rules:      evdev
model:      pc105
layout:     de
variant:    nodeadkeys
  • найти достаточно записей в /usr/share/X11/xkb/symbols/inet. Правая сторона -— это то, что увидит приложение, возможно, с модификаторами клавиши Shift и т. д., левая сторона -— это скан-коды. Я выберу этот, потому что на моей клавиатуре нет клавиши «калькулятор» :
  • .
key    {      [ XF86Calculator        ]       };
  • создайте файл в /usr/share/X11/xkb/keycodes/, который сопоставляет скан-коды с кодами клавиш (из первого шага ). Да, это кажется задним числом. Мой файл называется trustkeypad и выглядит так:
default xkb_keycodes "trustkeypad" {
    minimum= 8;
    maximum= 255;

    // keypad 9
     = 81;
};
  • скомпилируйте этот файл сxkbcomp -xkb trustkeypad

  • попробуйте с setxkbmap -v -v -device 17 -keycodes (filename). (17 – это идентификатор вашего xinput.)Результат у меня выглядит так:

Warning! Multiple definitions of keycodes
         Using command line, ignoring rules file
Applied rules from evdev:
rules:      evdev
model:      pc105
layout:     de
variant:    nodeadkeys
Trying to build keymap using the following components:
keycodes:   trustkeypad
types:      complete
compat:     complete
symbols:    pc+de(nodeadkeys)+inet(evdev)
geometry:   pc(pc105)

и это выглядит хорошо, особенно строка кодов клавиш. Если вы запустите xevсейчас, вы должны увидеть генерируемые новые символы. Увы, сейчас я получаю только половину -победы:

KeyPress event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043275, (1666,897), root:(1670,950),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043403, (1666,897), root:(1670,950),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043403, (1666,897), root:(1670,950),
    state 0x10, keycode 77 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043411, (1666,897), root:(1670,950),
    state 0x10, keycode 77 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

но после того, как я пару раз случайно разбил X (не думаю, что установка минимального значения в файле кодов клавиш выше поможет ), это ушло. Возможно, в этот момент поможет простая перезагрузка. После того, как вы добьетесь успеха, вы должны получить что-то вроде

KeyPress event, serial 38, synthetic NO, window 0x3e00001,
    root 0x168, subw 0x0, time 26443862, (930,972), root:(934,1025),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x3e00001,
    root 0x168, subw 0x0, time 26444022, (930,972), root:(934,1025),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

и вы можете проверить в своих пользовательских настройках, что теперь вы можете назначить ярлык для этой клавиши, и он скажет, что он назначен для клавиши «Калькулятор».

Здесь все еще отсутствует :выяснение того, как сделать это стандартной настройкой, в том числе при перезагрузке. Это, вероятно, потребует изучения udev, иhttps://help.ubuntu.com/community/Custom%20keyboard%20layout%20definitionsможет оказаться полезным, даже несмотря на то, что он имеет «устаревший» тег, датируемый 2014 годом.

1
17.05.2020, 12:10
1 ответ

Происходит следующее: дочерние процессы не завершаются после завершения своей задачи. Все процессы будут запускать собственный экземпляр внешнего цикла.

Вам нужен exit(0)после fflush.

Вы должны также waitдля детей.
Вы можете сделать это (1 )в конце с while (wait(NULL) != -1);или (2 )после каждого процесса с waitpid(pid, NULL, 0);послеif ((pid = fork()) < 0) {... } else {... }
Вам нужно будет включить <sys/wait.h>.

Первый вариант временно создаст много зомби, а второй убирает параллелизм.

1
28.04.2021, 23:13

Теги

Похожие вопросы