subj
как это реализовать? намеки :)
>subj
>как это реализовать? намеки :)
man ( fork & ( execl | execv ) & select )
Мониторишь стандартный ввод ( select() ),
как только нажата нужная комбинация клавишь делаешь fork(), execl...
А детали реализации зависят от конкретной версии UNIX,
хотя если придерживаться POSIX, XSI & etc., то можно написать
вполне портируемый код...
Совет: для начала поискать в gogle аналогичные проги...
>Мониторишь стандартный ввод ( select() ),вот собственно сам мониторинг меня и интересует! как его реализовать? что-бы программа висела в бекграунде и слушала клавиатуру!? как такое сделать?
>>Мониторишь стандартный ввод ( select() ),
>
>вот собственно сам мониторинг меня и интересует! как его реализовать? что-бы программа
>висела в бекграунде и слушала клавиатуру!? как такое сделать?
fd_set fdset;
FD_ZERO(&fdset);
FD_SET(0, &fdset);
while (select(1, NULL, &fdset, NULL, NULL))
{ if (FD_ISSET(0, &fdset) { read(0, ...); ... } }
Это как бы общая идея, конечно же значение fdset желательно сохранить
перед вызовом select...
>висела в бекграунде и слушала клавиатуру!? как такое сделать?
программа под UNIX не может одновременно висеть в бекграунде и читать stdin, потому что по определению прога-демон - это та, которая не имеет управляющего терминала, а следовательно не может читать stdin etc etc :))такое можно реализовать ИМХО только написав обработчик прерывания от клавиатуры и заменив им стандартный.
Но такими вещами под UNIX я не занимался поэтому посоветовать что-то толковое не могу.
>>висела в бекграунде и слушала клавиатуру!? как такое сделать?
>программа под UNIX не может одновременно висеть в бекграунде и читать
>stdin,
>потому что по определению прога-демон - это та, которая не имеет
>управляющего терминала, а следовательно не может читать stdin etc
>etc :))А? Между stdin, управляющим терминалом и клавиатурой нет ничего общего.
>такое можно реализовать ИМХО только написав обработчик прерывания от
>клавиатуры и заменив им стандартный.Почти правильно. Цепляться нужно к драйверу. Точнее, делать свой
драйвер, и ставить его между клавиатурой и "настоящим" драйвером.
Подробности у Рубини.Если все это делается для X, то можно обойтись более мирными средствами.
>Но такими вещами под UNIX я не занимался поэтому посоветовать что-то
>толковое не могу.
> Между stdin, управляющим терминалом и клавиатурой нет ничего общего
Есть - кусок системы, который их связывает до кучки :)
Но не в этом дело.При наличии /dev/console можно попробовать читать из него. Но:
1. будет работать только на локальной машине;
2. нужно сделать чтение без удаления, дабы все остальные получили клавиатуру. При этом, читать нужно в соответствии с архитектурой машины (для x86 - 1 байт, если он 0, то еще один байт) и удалять символы только при обнаружении своих комбинацийРекомендую код перехвата испытывать под X и не в виде демона, ибо в текстовой консоли при неправильной реализации ты можешь завесить клавиатурный ввод - придется или терминалом заходить и прибивать процесс или пользовать power/reset.
PS. Кому интересно поиздеваться над работающими непосредственно за машиной - заходим по сети и говорим "cat </dev/console &" :)
>subj
>как это реализовать? намеки :)
В свое время я это проделал используя стандартные средства Linux(если не в X-ах) так:
Допустим мы хотим сделать "гадость" при нажатии ctrl-alt-2:
Берете любой *.kmap файл (из /usr/share/keymaps/i386/qwerty/... например). (Если надо сделайте gunzip) сохраняете его где-нибудь и пишите туда строку:control alt keycode 3 = KeyboardSignal
Естественно надо проверить чтобы комбинация ctrl-alt-2 не была занята (обычно она свободна).
Далее в inittab пишем:
kb::kbrequest:/some/our/programm
(Обычно в inittab уже есть строка типа:
kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work.")Затем перезапустить init (init q или послать SIGHUP) и загрузить через loadkeys ваш keymap файл и все. По крайней мере мне этого вполне хватило.
В вашем случае эта прога может заслать какому-нибудь демону какой-нибудь сигнал, а тот уже сделает свое "черное дело". Тоже можно сделать практически с любой комбинацией клавиш.
Правда из по X-ов это не работает.