如果希望某个硬件动作发生后,用户能在用户态编写中断处理程序,可以使用内核信号,下面是使用范例。
驱动(中断处理):
static irqreturn_t key_interrupt(int irq, void *dev_id, struct pt_regs *regs) { printk(DEV_NAME" Interrupted!\n"); send_sig(SIGUSR1, current, NULL); //send SIGUSR 1
return IRQ_HANDLED; }
|
current是内核是一个全局变量,指向当前在运行的进程。但是内核运行时搜索到特定进程的进程号是个费事的工作,可能要遍历整个进程控制块链表,会很费时间。这也是不推荐在用户态编写中断程序的原因。
驱动程序其它都没有不同,仅仅是在中断中发射信号而已。
用户程序:
/* * Catch SIGUSR1 sent from kernel mode Interrupt routine. * 捕捉内核态中断服务程序发送的SIGUSR1信号。 * 用户可以在用户态编写自己的中断处理程序。 */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <errno.h> #include <fcntl.h> #include <sys/types.h> #include <signal.h>
//#define MODE1 //#define MODE2 void signal_handler(int signo) { printf("####in %s\n", __func__); }
int main(int argc, char **argv) { #if defined (MODE1) signal(SIGUSR1, (void *)signal_handler); //这样可以
#else //这样也可以,第一种方式更加简单一些 struct sigaction action; action.sa_handler = signal_handler; action.sa_flags = 0; sigaction(SIGUSR1, &action, NULL); #endif
while(1); return 0; }
|