Имеется модуль ядра,kernel 2.2.14(RedHat 6.2)... По прерыванию из bottom-half обработчика прерывания посылается сигнал юзерскому процесу таким образом:
код: ... ... struct XXX_cbd { unsigned long signature; void (*isr)(void); struct sigaction sa; sigset_t mask; }; ... struct siginfo info; info.si_signo = dev->callback[channel].signo; info.si_errno = channel;info.si_code = SI_MESGQ;// must be < 0 for info.si_ptr info.si_pid = 0; /* sending from kernel */ info.si_uid = 0; info.si_ptr = dev->callback[channel].context; /* XXX_cbd struct*/ send_sig_info(info.si_signo, &info, dev->callback[channel].process);
---------------------------------------------------------------------
По приходу в юзерский обработччик:
код: static void XXX_signal_handler(int signo, siginfo_t * siginfo, void * arg) { if(signo == SIGUSR2 && siginfo->si_signo == SIGUSR2 && siginfo->si_code == SI_MESGQ && siginfo->si_pid == 0 && siginfo->si_uid == 0) { struct XXX_cbd * cptr = (struct DM6420HR_cbd *)siginfo->si_ptr; if(cptr->signature == magic_signature && cptr->isr != NULL) (*cptr->isr)(); } }
---------------------------------------------------------------------
Наблюдаются странные вещи: siginfo->si_code не равно SI_MESGQ а равно 0 siginfo->si_uid не равно 0 а равно к примеру C0A30000 а siginfo->si_ptr приходит вообще равным NULL вместо того что бы указывать куда надо...
В чём может быть дело? ЗЫ. В RedHat 7.3 ( kernel 2.4.18) всё работает правильно. Пытался посылать сигнал не из bottom-half обработчика(mark_bh(IMMEDIATE_BH) ) а также непосредственно из обработчика прерывания - результат тот же.