Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Послать прерывание 
:(
    Опции темы
desevg
Дата 10.12.2010, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 22.1.2009

Репутация: нет
Всего: нет



Здравствуйте, я ищу способ реализовать небольшую программу, которая будет способна провоцировать прерывание, в моем случае мне нужно посылать 9 прерывание.

Т.е. как вы знаете, 9 прерывание посылается при взаимодействии с клавиатурой, мне необходимо знать, возможно ли программным путем создавать/посылать 9 прерывание(любое другое)?

Я провел некоторый поиск и нашел только как можно установить свой обработчик на прерывание, но не как его спровоцировать....

Язык программирования - С, ОС - Linux Ubunta. 

Спасибо! smile

Это сообщение отредактировал(а) desevg - 10.12.2010, 12:26
PM MAIL   Вверх
bsa
Дата 10.12.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



а зачем тебе это?
PM   Вверх
desevg
Дата 10.12.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 22.1.2009

Репутация: нет
Всего: нет



во-первых это интересно smile я вот только как пару, тройку недель начал си изучать и еще много не знаю...

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



Это сообщение отредактировал(а) desevg - 10.12.2010, 16:25
PM MAIL   Вверх
desevg
Дата 11.12.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 22.1.2009

Репутация: нет
Всего: нет



ну хоть на мысль наведите :( куды копать?
PM MAIL   Вверх
xvr
Дата 13.12.2010, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(desevg @ 11.12.2010,  15:19)
ну хоть на мысль наведите :( куды копать?

Если под 'прерыванием' имеется в виду сигнал, то копать в сторону man 2 kill

Добавлено @ 13:58
Если же имеетс я в виду аппаратное прерывание (т.е. INT процессора), то об этом лучше забыть сразу. А если не получилось, то копать в сторону загружаемых драйверов и исходников ядра (т.к. не уверен, что в ядре есть API для эмулирования прерываний)


Это сообщение отредактировал(а) xvr - 13.12.2010, 13:59
PM MAIL   Вверх
desevg
Дата 13.12.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 22.1.2009

Репутация: нет
Всего: нет



угу, спасибо smile уже начал покапывать в сторону сигналов
PM MAIL   Вверх
svlary
Дата 14.12.2010, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Передача сигналов Другому Процессу

Функция kill может использоваться, чтобы послать сигнал другому процессу. Несмотря на имя, она может использоваться для множества вещей отличных от завершения процесса. Вот некоторые примеры ситуаций, где Вы могли бы хотеть посылать сигналы между процессами:

    * Родительский процесс назначает дочернему выполнять задачу, возможно имеющую бесконечный цикл, и завершает дочерний процесс, когда задача больше ненужна.
    * Процесс выполняется как часть группы, и должен завершать или информировать другие процессы в группе, когда ошибка или другое событие происходит.
    * Два процесса должны синхронизироваться при работе вместе.

Функция kill объявлена в " signal.h ".

Код

           int kill (pid_t pid, int signum)  (функция)


Функция 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) 

PM MAIL   Вверх
desevg
Дата 3.1.2011, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 22.1.2009

Репутация: нет
Всего: нет



спасибо за ответы. прочел информацию и посмотрел примеры на эту тему, но не нашел ответа на свою задачу... может плохо искал, но..

как я понял функция signal используется для установки функции callback для определенного сигнала, а функция kill может послать сигнал с номером от 0-31, но
я не нашел, как я могу послать сигнал другому процессу, чтобы он принял это, как сигнал от клавиатуры.

видно рыть нужно в другую сторону.... идеи? smile


PM MAIL   Вверх
xvr
Дата 3.1.2011, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(desevg @  3.1.2011,  13:54 Найти цитируемый пост)
я не нашел, как я могу послать сигнал другому процессу, чтобы он принял это, как сигнал от клавиатуры.
Увы, в User Space 'сигналы с клавиатуры' весьма многолики, и могут доставляться множеством разных способов (в зависимости от программы).
Цитата(desevg @  3.1.2011,  13:54 Найти цитируемый пост)
видно рыть нужно в другую сторону....
Угу, в сторону фильтрующих драйверов.


PM MAIL   Вверх
svlary
Дата 4.1.2011, 06:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(desevg @  3.1.2011,  13:54 Найти цитируемый пост)
 как я могу послать сигнал другому процессу

Для того, чо бы послать сигнал ПРОЦЕССУ нужно только знать PID этого процесса. После этого вызываете  kill(PID, <сигнал>) и все...

Цитата(desevg @  3.1.2011,  13:54 Найти цитируемый пост)
чтобы он принял это,  как сигнал от клавиатуры.

ЕМНИП, сигналов ОТ КЛАВИАТУРЫ всего четыре :
  • SIGINT          2       /* Interrupt (ANSI).  Ctrl/C */ 
  • SIGQUIT        3       /* Quit (POSIX).  Ctrl/\*/ 
  • SIGTSTP       20      /* Keyboard stop (POSIX). Ctrl/Z */ 
  • SIGCONT      18      /* Continue (POSIX).  */

PM MAIL   Вверх
xvr
Дата 4.1.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(svlary @  4.1.2011,  06:10 Найти цитируемый пост)
Для того, чо бы послать сигнал ПРОЦЕССУ нужно только знать PID этого процесса. 
ТС запутался сам, и успешно запутал других. Ему не надо посылать СИГНАЛ (в Unix смысле) процессу, ему надо эмулировать клавиатурный ввод для процесса.  smile 


PM MAIL   Вверх
svlary
Дата 5.1.2011, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(xvr @  4.1.2011,  12:49 Найти цитируемый пост)
ТС запутался сам, и успешно запутал других.

Похоже на то... Но, если предположить, что 
Цитата

ему надо эмулировать клавиатурный ввод для процесса
.
То как тогда понимать начальное сообщение в ветке :
Цитата

мне необходимо знать, возможно ли программным путем создавать/посылать 9 прерывание(любое другое)

?
Думаю, что автору надо уточнить постановку задачи.
PM MAIL   Вверх
xvr
Дата 5.1.2011, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(svlary @  5.1.2011,  06:29 Найти цитируемый пост)
То как тогда понимать начальное сообщение в ветке :
Цитата

мне необходимо знать, возможно ли программным путем создавать/посылать 9 прерывание(любое другое)
Понимать как 'эмулировать INT 9 процессора' (или любое другое АППАРАТНОЕ прерывание)
В DOS'е клавиатура действительно висит на INT 9 (программирование PIC'а DOS'у достается по наследству от BISO'а), в Linux'е это уже будет не INT 9 (Linux перепрограммирует PIC, или вообще/почти его не использует, если найдет APIC)
Кроме того, для USB клавиатур вообще никакого INT не будет - их драйвер сидит глубоко в стеке USB/HID устройств, и напрямую с железом не работает  smile

Добавлено через 1 минуту и 41 секунду
ТС собирался эмулировать ввод с клавиатуры на самом низком аппаратном уровне (в DOS это пройдет влегкую, в Linux это гораздо сложнее)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.