![]() |
|
Модераторы: xvr |
![]()
|
|
| desevg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 22.1.2009 Репутация: нет Всего: нет |
Здравствуйте, я ищу способ реализовать небольшую программу, которая будет способна провоцировать прерывание, в моем случае мне нужно посылать 9 прерывание.
Т.е. как вы знаете, 9 прерывание посылается при взаимодействии с клавиатурой, мне необходимо знать, возможно ли программным путем создавать/посылать 9 прерывание(любое другое)? Я провел некоторый поиск и нашел только как можно установить свой обработчик на прерывание, но не как его спровоцировать.... Язык программирования - С, ОС - Linux Ubunta. Спасибо! Это сообщение отредактировал(а) desevg - 10.12.2010, 12:26 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
а зачем тебе это?
|
|||
|
||||
| desevg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 22.1.2009 Репутация: нет Всего: нет |
во-первых это интересно
есть просто такие программы, которые реагируют на нажатия различных клавиш, банальный пример клавиатурные тренажеры(любая прога имеет горячие клавиши к примеру), упала в голову мысль, как можно их заставить плясать под свою дудку программным способом) Это сообщение отредактировал(а) desevg - 10.12.2010, 16:25 |
|||
|
||||
| desevg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 22.1.2009 Репутация: нет Всего: нет |
ну хоть на мысль наведите :( куды копать?
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Если под 'прерыванием' имеется в виду сигнал, то копать в сторону man 2 kill Добавлено @ 13:58 Если же имеетс я в виду аппаратное прерывание (т.е. INT процессора), то об этом лучше забыть сразу. А если не получилось, то копать в сторону загружаемых драйверов и исходников ядра (т.к. не уверен, что в ядре есть API для эмулирования прерываний) Это сообщение отредактировал(а) xvr - 13.12.2010, 13:59 |
|||
|
||||
| desevg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 22.1.2009 Репутация: нет Всего: нет |
угу, спасибо
|
|||
|
||||
| svlary |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
Передача сигналов Другому Процессу
Функция kill может использоваться, чтобы послать сигнал другому процессу. Несмотря на имя, она может использоваться для множества вещей отличных от завершения процесса. Вот некоторые примеры ситуаций, где Вы могли бы хотеть посылать сигналы между процессами: * Родительский процесс назначает дочернему выполнять задачу, возможно имеющую бесконечный цикл, и завершает дочерний процесс, когда задача больше ненужна. * Процесс выполняется как часть группы, и должен завершать или информировать другие процессы в группе, когда ошибка или другое событие происходит. * Два процесса должны синхронизироваться при работе вместе. Функция kill объявлена в " signal.h ".
Функция kill посылает сигнал signum процессу или группе процесса, заданной pid. Кроме сигналов, перечисленных в Разделе 21.2 [Стандартные Сигналы], signum может также иметь нулевое значение, чтобы проверить правильность pid. Pid определяет процесс или группу процесса, как получателя сигнала: Pid > 0 Процесс, чей идентификатор - pid. Pid == 0 Все процессы в той же самой группе что и отправитель. Отправитель непосредственно не получает сигнал. Pid < -1 Группа процесса, чей идентификатор есть -pid. Pid == -1 Если процесс привилегирован, посылает сигнал всем процессам, кроме некоторых специальных процессов системы. Иначе, посылает сигнал всем процессам с тем же самым эффективным ID пользователя. Процесс может посылать сигнала себе обращением kill (getpid (), signum). Если kill используется процессом, чтобы послать сигнал себе, и сигнал не блокирован, то kill позволяет этому процессу принять по крайней мере один сигнал (который мог некоторым другим задержанным сигналом вместо сигнала signum) прежде чем он возвращается. Возвращаемое значение из kill - нуль, если сигнал может быть послан успешно. Иначе, никакой сигнал не послан, и возвращается значение -1. Если pid определяет посылку сигнала отдельным процессам, kill успешно завершается, если он может посылать сигнал по крайней мере одному из них. Не имеется никакого способа, которым Вы можете узнать, который из процессов получил сигнал или что все они получили его. Следующие errno условия ошибки определены для этой функции: EINVAL аргумент signum - недопустимое или неподдерживаемое число. EPERM Вы не имеете привилегий, чтобы послать сигнал процессу или любому из процессов в группе процесса, именованной pid. ESCRH id аргумент не относится к существующему процессу или группе. int killpg (int pgid, int signum) (функция) Подобна kill, но посылает сигнала группе процесса pgid. Эта функция предусмотрена для совместимости с BSD. Как простой пример kill, обращение kill (getpid (), sig) имеет тот же самый эффект как raise (sig). Библиотека языка C GNU glibc. Сандра Лузмор (Sandra Loosemore) Ричард Сталлман (Richard M. Stallman) Роланд Макграх (Roland MacGrath) Андрей Орам (Andrew Oram) |
|||
|
||||
| desevg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 22.1.2009 Репутация: нет Всего: нет |
спасибо за ответы. прочел информацию и посмотрел примеры на эту тему, но не нашел ответа на свою задачу... может плохо искал, но..
как я понял функция signal используется для установки функции callback для определенного сигнала, а функция kill может послать сигнал с номером от 0-31, но я не нашел, как я могу послать сигнал другому процессу, чтобы он принял это, как сигнал от клавиатуры. видно рыть нужно в другую сторону.... идеи? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Угу, в сторону фильтрующих драйверов. |
|||
|
||||
| svlary |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
Для того, чо бы послать сигнал ПРОЦЕССУ нужно только знать PID этого процесса. После этого вызываете kill(PID, <сигнал>) и все... ЕМНИП, сигналов ОТ КЛАВИАТУРЫ всего четыре :
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
| svlary |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
Похоже на то... Но, если предположить, что
То как тогда понимать начальное сообщение в ветке :
? Думаю, что автору надо уточнить постановку задачи. |
||||
|
|||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
В DOS'е клавиатура действительно висит на INT 9 (программирование PIC'а DOS'у достается по наследству от BISO'а), в Linux'е это уже будет не INT 9 (Linux перепрограммирует PIC, или вообще/почти его не использует, если найдет APIC) Кроме того, для USB клавиатур вообще никакого INT не будет - их драйвер сидит глубоко в стеке USB/HID устройств, и напрямую с железом не работает Добавлено через 1 минуту и 41 секунду ТС собирался эмулировать ввод с клавиатуры на самом низком аппаратном уровне (в DOS это пройдет влегкую, в Linux это гораздо сложнее) |
||||
|
|||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |