LINUX.ORG.RU

Android native обработка сигналов

 , ,


0

1

Доброго времени суток! Пытаюсь добавить обработчик пользовательских сигналов под сабжем. Посылаю сигнал из драйвера, принимаю в user space в нативном приложении. В приложении приведённым способам (для краткости опустил проверки возвращаемых значений и т.п.) устанавливается обработчик сигнала, ожидается сигнал и удаляется обработчик. Это всё повторяется в while 1000 раз. Проблема в том, что Android падает в рандомных местах программы, после рандомного количества повторений (1 ~ 200) и не остается ни кол стэка, ни дампа. Что я делаю не так? Может сигналы из драйвера нельзя так принимать? Капание в интернете не помогает :(

init()
{
   struct sigaction action;
   sigset_t signal_set;

   sigemptyset(&signal_set);
   sigaddset(&signal_set, SIG_USER);

   action.sa_handler = sig_handler;
   action.sa_mask = signal_set;
   action.sa_flags = 0; 
/*без обнуления sa_flags программа падает при выходе из обработчика:
: type=1701 audit(0.0:270): auid=4294967295 uid=0 gid=0 ses=4294967295 subj=u:r:su:s0 reason="memory violation" sig=11*/
   sigaction(SIG_USER, &action, NULL);
}
main()
{
   init();
   sem_timedwait(...);
   deinit();
}
deinit()
{
   struct sigaction action;
   sigset_t signal_set;
   sigemptyset(&signal_set);
   sigaddset(&signal_set, SIG_USER);
   action.sa_handler = SIG_DFL;
   sigaction(SIG_USER, &action, NULL);
}
signal_handler(int n)
{
   LOG("signal handler");
   sem_post(...)
   return;
}

Похоже падает не приложение, а драйвер.. Я посылаю сигнал и обработчика прерывания. Можно ли так делать?

lup
() автор топика
Ответ на: комментарий от lup

Да, похоже так делать нельзя. Буду читать LDD и, похоже, делать tasklets или вообще обрабатывать прерывания в user mode, экспортировав нужный GPIO в /proc/...

lup
() автор топика
Ответ на: комментарий от lup

work_queue

Сделал отправку сигнала из work_queue, падать перестало, теперь нормально работает.

lup
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.