URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1170
[ Назад ]

Исходное сообщение
"прога-демон которая запускает программы при нажатии на определенную клавишу!"

Отправлено sector119 , 10-Дек-02 00:44 
subj
как это реализовать? намеки :)

Содержание

Сообщения в этом обсуждении
"RE: прога-демон которая запускает программы при нажатии на определенную клавишу!"
Отправлено pLYM0rph , 10-Дек-02 08:46 
>subj
>как это реализовать? намеки :)
man ( fork & ( execl | execv ) & select )
Мониторишь стандартный ввод ( select() ),
как только нажата нужная комбинация клавишь делаешь fork(), execl...
А детали реализации зависят от конкретной версии UNIX,
хотя если придерживаться POSIX, XSI & etc., то можно написать
вполне портируемый код...
Совет: для начала поискать в gogle аналогичные проги...

"RE: прога-демон которая запускает программы при нажатии на определенную клавишу!"
Отправлено sector119 , 10-Дек-02 09:01 
>Мониторишь стандартный ввод ( select() ),

вот собственно сам мониторинг меня и интересует! как его реализовать? что-бы программа висела в бекграунде и слушала клавиатуру!? как такое сделать?


"RE: прога-демон которая запускает программы при нажатии на определенную клавишу!"
Отправлено pLYM0rph , 10-Дек-02 12:13 
>>Мониторишь стандартный ввод ( 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...

"RE: прога-демон которая запускает программы при нажатии на определенную клавишу!"
Отправлено joker , 10-Дек-02 13:07 
>висела в бекграунде и слушала клавиатуру!? как такое сделать?
программа под UNIX не может одновременно висеть в бекграунде и читать stdin, потому что по определению прога-демон - это та, которая не имеет управляющего терминала, а следовательно не может читать stdin etc etc :))

такое можно реализовать ИМХО только написав обработчик прерывания от клавиатуры и заменив им стандартный.
Но такими вещами под UNIX я не занимался поэтому посоветовать что-то толковое не могу.


"RE: прога-демон которая запускает программы при нажатии на определенную клавишу!"
Отправлено vnp , 10-Дек-02 23:00 
>>висела в бекграунде и слушала клавиатуру!? как такое сделать?
>программа под UNIX не может одновременно висеть в бекграунде и читать
>stdin,
>потому что по определению прога-демон - это та, которая не имеет
>управляющего терминала, а следовательно не может читать stdin etc
>etc :))

А? Между stdin, управляющим терминалом и клавиатурой нет ничего общего.

>такое можно реализовать ИМХО только написав обработчик прерывания от
>клавиатуры и заменив им стандартный.

Почти правильно. Цепляться нужно к драйверу. Точнее, делать свой
драйвер, и ставить его между клавиатурой и "настоящим" драйвером.
Подробности у Рубини.

Если все это делается для X, то можно обойтись более мирными средствами.

>Но такими вещами под UNIX я не занимался поэтому посоветовать что-то
>толковое не могу.



"RE: прога-демон которая запускает программы при нажатии на определенную клавишу!"
Отправлено XMan , 10-Дек-02 23:22 
> Между stdin, управляющим терминалом и клавиатурой нет ничего общего
Есть - кусок системы, который их связывает до кучки :)
Но не в этом дело.

При наличии /dev/console можно попробовать читать из него. Но:
1. будет работать только на локальной машине;
2. нужно сделать чтение без удаления, дабы все остальные получили клавиатуру. При этом, читать нужно в соответствии с архитектурой машины (для x86 - 1 байт, если он 0, то еще один байт) и удалять символы только при обнаружении своих комбинаций

Рекомендую код перехвата испытывать под X и не в виде демона, ибо в текстовой консоли при неправильной реализации ты можешь завесить клавиатурный ввод - придется или терминалом заходить и прибивать процесс или пользовать power/reset.

PS. Кому интересно поиздеваться над работающими непосредственно за машиной - заходим по сети и говорим "cat </dev/console &" :)


"RE: прога-демон которая запускает программы при нажатии на о..."
Отправлено Soldier , 13-Дек-02 13:36 
>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-ов это не работает.